Zaawansowana obsługa wyjątków

0

Witam chciałbym się dowiedzieć czy istnieje możliwość "zaawansowanej" obsługi wyjątków, tj.
Wytłumaczę to na podstawie logowania do bazy w Oraclu:

try
{ cos tam }
catch (SQLException e)
{ printlajn }

I jesli podam złe dane logowania oczywiście ten wyjątek jest przechwytywany, problem jest jeśli np. istnieje taki użytkownik ale nie ma uprawnień do zalogowania się (komunikat user STEFAN lacks CREATE SESSION privilege), wtedy także przechwytywane jest to jako taki sam wyjątek, macie jakiś sposób na to ?

0

A dlaczego miałby rzucać innym obiektem wyjątku. Dane, czy nie ma takiego usera, czy podał niepoprawne hasło, czy jego konto jest zablokowane powinny być w tym obiekcie rzucanym, więc przestudiuj budowę danego obiektu

0

nie widzę różnicy między nieistnieniem użytkownika a brakiem dostępu do danej bazy danych. Po co dodawać do listy użytkowników kogoś kto nie może przeglądać danej bazy? Przynajmniej na mój chłopski rozum. Może się mylę.

0

Jest coś takiego, że uprawnienia mogą zostać odebrane. To jest taki zabieg raczej kosmetyczny, bez tego program też będzie hulał ale z racji, ze to inżynierka to staram się, żeby była jak najlepsza :). Próbowałem robić to w ten sposób, że porównywałem tekst błędu z jakimś tam wzorcem ale niestety nie działało :/

0

To znaczy, że źle porównywałeś.

0

Klasa SQLException ma metodę http://download.oracle.com/javase/6/docs/api/java/sql/SQLException.html#getErrorCode%28%29 która zwraca errorcode dostawcy. Wystarczy zatem napisać sobie słownik z co popularniejszymi kodami błędów (tymi co chcesz obsłużyć) i tyle.

1

Po pierwsze w takich przypadkach sprawdza się, czy wyjątek który przechwytujesz nie ma swojego drzewka rodzinnego (możesz niepotrzebnie przechwytywać "rodzica" zamiast jednego z "dzieci").
Na przykład SQLException ma swoje bardziej konkretne wersje: BatchUpdateException, RowSetWarning, SerialException, SQLClientInfoException, SQLNonTransientException, SQLRecoverableException, SQLTransientException, SQLWarning, SyncFactoryException, SyncProviderException. Następnym krokiem jest przyjrzenie się wyjątkowi i jego metodom. W tym wypadku masz metodę: public int getErrorCode(), która może uszczegółowić problem lub w ogóle go rozwiązać.

Po drugie sprawdza się czy takie same jest źródło wygenerowania wyjątku - w tym wypadku sprawdzasz wynik metody getCause(), w następnej kolejności możesz porównywać wynik metody getStackTrace(), choć to jest już bardzo zależne od konkretnej wersji softu bazy danych (mimo to powinieneś wychwycić różnicę między wyjątkiem wynikającym z logina/hasła, albo z niewystarczających praw - wyniknie to z "miejsca" wygenerowania wyjątku). W ostateczności można też porównywać Porównywanie tekstu komunikatu wyjątku, to trzecie i najgorsze rozwiązanie gdy nie pozostało już nic innego.
Niestety są też takie bazy, gdzie wszystkie problemy z dostępem są zamknięte w tej samej procedurze (w efekcie dostaniesz ten sam stos na poziomie Javy), generowany jest ten sam komunikat, a przyczyna jest olewana lub inicjowana jako null (ten sam efekt).

ups. Koziołek już odpowiedział.

0

Ale prościzna, wielki dzięki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1