Wyjątki Try-Catch-Finally

0

Witam.

Piszę mały programik i trafiłem na mały problem. Otóż, chciałbym w jednym programie zaprezentować równocześnie obsługę trzech różnych wyjątków zdefiniowanych przez siebie. Próbuję (zgodnie z informacjami z sieci że Finally zawsze się wykonuje) zrobić to tak:

				try {
					kod generujacy wyjatek1;
				}
				catch (wyjatek1 e){
					obsluga;
				}
				catch (wyjatek2 e){
					obsluga;
				}
				catch (wyjatek3 e){
					obsluga;
				}
				finally {
						try {
							kod generujacy wyjatek2;
						}
						catch (wyjatek1 e){
							obsluga;
						}
						catch (wyjatek2 e){
							obsluga;
						}
						catch (wyjatek3 e){
							obsluga;
						}
						finally {
								try {
									kod generujacy wyjatek3;
								}
								catch (wyjatek1 e){
									obsluga;
								}
								catch (wyjatek2 e){
									obsluga;
								}
								catch (wyjatek3 e){
									obsluga;
								}
				}

Niestety, program wypisuje swój przebieg (każdy krok jest wypisywany) do momentu obsługi wyjątku1. Czy dobrze w ogóle to zaplanowałem? A może w jakiś inny sposób da się w jednym programie zaprezentować obsługę tych trzech różnych wyjątków?

0

o ile w osbsłudze nie robisz throw'ów jakiś wyjątków na wyższy poziom, to możesz finally pominąć i po prostu pod sobą ustawić bloki try..catch bez finally. Jeżeli rzucasz wyjątkami w obsłudze, musi być finally.

Dodatkowo bardzo ważne jest to, że jeżeli w bloku try lub catch wyrzucony będzie wyjątek do góry, natomiast w bloku finally również rzucimy wyjątkiem (np NPE) poprzedni wyjątek zostanie połknięty;

0

Obsługa polega jedynie na tym że wypisuje komunikat typu

System.err.println("Przechwytuje ZaDuzoWymiarow: " + e.msg);

Każdy wyjątek wygląda podobnie:

class ZaDuzoWymiarow extends Exception {
	String msg;
	
	ZaDuzoWymiarow(String x) {
        msg = x;
    }
}

Niestety, jak bym kodu nie ułożył - czy to kolejny wyjątek jest w finally czy w kolejnym try-catch to i tak program kończy pracę po wystąpieniu pierwszego wyjątku.

EDIT:
Dzięki wielkie, działa! ;).

0

Spróbuj złapać throwable w catch, może to jakiś "grubszy" błąd. Btw. w Java 7, możesz łapać wiele wyjątków w ramach jednego catch.

0

Odpowiedz dlaczego nie powinno się łapać Throwable: Bezpośrednio, to dlatego, że Throwable obejmuje nie tylko Exception ale i Error. Errory zazwyczaj chce się puszczać dalej do obsługi przez VM (są to np OutOfMemoryError itp). Sprawdzić proponuje samemu dokumentacje do Throwable->Error->*. Rodzajów wyjątków i błędów jest na tyle wiele, ze nie będziesz w stanie ich obsłużyć w jednym bloku. Wyjątkiem może być sytuacja kiedy w catch zrobisz System.exit(errCode) ale tak się raczej tego nie robi.

Jeżeli chodzi o obsługę wyjątków, to NALEŻY być jak najbardziej szczegółowym co do klas które chcemy wyłapać. OFC, można sobie wyłapać wszystkie Exception, ale co później z takim fantem zrobić? Jeżeli jestes ABSOLUTNIE pewnien, że WSZYSTKIE wyjątki obsłużysz w ten sam sposób to proszę bardzo, ale w 99% przypadków tak właśnie nie jest - dlatego trzeba być szczegółowym. Jeżeli natomiast nie wiemy co zrobić z wyjątkiem, to warto go albo wyrzucić poziom wyżej, albo w ostateczności opakować w RuntimeException i tego też wyrzućić. Połykanie wyjątków jest raczej niewskazane (oczywiście łyka się wyjątki, ale jest to znowu procent z grona przypadków użycia, dlatego stwierdzić należy, że "nie połykamy wyjątków")

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