Obsluga wyjatkow

0

Fragment kodu:

try{

cos tam
}

catch(Wyjatek 1)
{
cos co moze zwrocic wyjatek
}
catch(Exception x)
{
cos tam;
}

I teraz takie pytanie: w jaki sposob zrobic, by to co moze sie sypnac w pierwszym catchu przechwyci catch(Exception x)? Bo pisanie w catchu kolejnego try-catch strasznie mi sie nie podoba ;] Mam nadzieje, ze ktokolwiek rozumie o co mi chodzi

0

nie można tak zrobić. catch wyłapuje wyjątki tylko z bloku try z którym jest związane.

0

W catch raczej nie powinieneś robić ryzykownych instrukcji które mogą rzucić wyjątek, ale jeśli już musisz to musisz normalnie ten wyjątek obsługiwać za pomocą try i catch, nic na to nie poradzisz ze ci urośnie taka piramidka z tego.

0

Jest nawet gorzej. Rzucony w bloku catch wyjątek zastąpi wcześniej rzucony wyjątek (zwykle ten ważniejszy). A przynajmniej tak było do wersji 1.6. (bug javy 1.5 i wcześniejszych).
Generalna zasada jest taka aby kod zamknięty w catch nie mógł spowodować żadnego wyjątku, nawet banalnego.

0
Olamagato napisał(a)

Generalna zasada jest taka aby kod zamknięty w catch nie mógł spowodować żadnego wyjątku, nawet banalnego.

To zapytam z ciekawości. Co mam zrobić, jeżeli złapałem wyjątek i teraz chcę zapisać informację o błędzie do pliku? Przecież zapisywanie też może rzucić przykładowo IOException.

0

Przecież wyjątek i zrzut stosu możesz zapisać do dowolnej lokalnej zmiennej lub dowolnego pola obiektu na stercie. I odpowiednio go wykorzystać lub ponownie rzucić w odpowiednim momencie.

Co prawda przy dużym pechu, w każdym momencie może się też zdarzyć OutOfMemoryException, ale to już sytuacja skrajna bo takie wyjątki łapią tylko paranoicy jak ja ;) lub tacy, którzy za swój soft biorą bardzo grubą kasę.

0

Powiedz ze zartujesz z tym OutOfMemory, prosze...

0
Olamagato napisał(a)

OutOfMemoryException
Nie przypadkiem OutOfMemoryError ?

0

A tak, oczywiście. "Exception" było z rozpędu. :)
@::. To oczywiście żart bo w przetestowanym sofcie nic takiego się nie sprawdza. Chociaż dobrze jest jak aplikacja jest w stanie monitorować ilość pamięci, którą ma do dyspozycji. Pomijając już to, że Errorów nie łapie się z założenia. :)

0
Olamagato napisał(a)

Pomijając już to, że Errorów nie łapie się z założenia. :)

Oczywiście że się łapie z założeniem...niekiedy jedynym sposobem na "poprawne sterowanie" jest celowe wyłapywanie wyjątków. Najprostrzy przykład: masz sobie sockecik już po połączeniu i nagle klient się wyłącza i dostajesz java.net.SocketException: socket closed i już wiesz ze musisz znowu przejsć w stan nasłuchu. Jakbyś to zrealizował niby "nie łapiąc z założenia"? A różnicą jest, czy dostaniesz socket close czy connection reset i tak mozęsz sterować programem.

Pozdro

PS: No i jeszcze przeciez sami możemy sobie stworzyc klasę co będzie dziedziczyć po Exception i tam sobie możemy popisać różne bzdurki jakie chcemy. Np. bedzie metoda trescaOstatniegoBledu, która nam wyłapie czy błąd był w pierwszym catchu czy w drugim i napisze jego treść.

0

Olamagato nie chodziło o wyjątki (klasa Exception) tylko o "errory" (klasa Error), których rzeczywiście nie powinno się wyłapywać:
http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Error.html

@down poprawione :)

0

NIE powinno się :P

0
lemmiwink napisał(a)

Olamagato nie chodziło o wyjątki (klasa Exception) tylko o "errory" (klasa Error), których rzeczywiście nie powinno się wyłapywać:
http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Error.html

@down poprawione :)

Taaa, Po pierwsze errory i exceptiony dziedziczą i tak po tej samej klasie Throwable.
Po drugie Olamagato sam chyba do końca nie rozróżnia errorów od exceptionów, więc jak on sam nie wie to Ty tym bardziej nie wiesz co on wie:-)
Po trzecie i najważniejsze: autor postu dał tytuł "Obsluga wyjatkow" i zamieścił kod źródłowy try-catch-exception (wyjątek) więc mowa jest o wyjątkach a nie o errorach. A wyjątki należy łapać i obsługiwać na swój sposób.
A jak już chcecie o errorach przecież błąd braku pamięci jest do obsłuzenia i wybrnięcia. Przykłąd w apliakcji rozpoznawajacej i przetwarzajacej obrazy. Dostajesz błąd ale maszyna sie nie wysypie od razu i masz czas na "zerowanie" zapamiętanych a nie koniecznie wykorzystanych wzorców. Oczywiście o niebo lepszym byłoby monitorowanie zasobów pamięci.

0
shooter3 napisał(a)

NIE powinno się :P

Nie, ze nie powinno się tylko z racji, ze mogą wystąpić gdziekolwiek w programie to ich wyłapanie jest bardzo trudne albo niemożliwe-a nie że się nie powinno.

Matematyczne obliczenia do wielowymiarowych tablic są przykładem na to iż można wyłapaći użyc takiego errora.

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