2011-08-28 15 views
19

Pracuję z interfejsem API, który twierdzi, że zwraca wartość true, jeśli się to uda, i false, jeśli się nie powiedzie. Ale także twierdzi, że rzuca różne wyjątki, jeśli zawiedzie. W jaki sposób może zwrócić false i rzucić wyjątek?Zwróć wartość ORAZ wyrzuć wyjątek?

Odpowiedz

25

Nie można zgłaszać wyjątków i zwracać wartości z pojedynczego wywołania funkcji.

Być może powoduje to coś w rodzaju zwracania false, jeśli wystąpił błąd, ale zgłoszenie wyjątku, jeśli dane wejściowe są nieprawidłowe.

edit: PaulPRO napisali (teraz już usunięty) odpowiedź wskazując, że jest to techniczniemożna spowodować wyjątek być rzucony w innym wątku, wracając wartość w aktualnej. Pomyślałem, że warto to zauważyć, nawet jeśli nie jest to coś, co powinno się kiedykolwiek zobaczyć.

+0

To, co wymyśliłem. Pomyślałem, że może być jakiś trik z blokiem w końcu. – mark

+0

po zgłoszeniu wyjątku program przestaje działać, nawet jeśli nie można wykonać obu tych czynności. Zastanawiam się, czy masz zwrot w swoim bloku "try", czy program nadal przechodzi "ostatni" blok, ponieważ jeśli zwrócisz wartość w bloku try i wrzucisz wyjątek throwów do bloku końcowego, to 've done both .. –

+2

@ Karel-Jan Misseghers: nie, w Javie twój program robi ** ZDECYDOWANIE NIE ** przestaje działać po zgłoszeniu wyjątku. Nie masz pojęcia, jak działają wyjątki Javy, i oczywiście nie przeprowadziłeś jeszcze wielowątkowych programów Java. Możesz mieć wiele wątków, które z powodzeniem pracują, gdy niesprawdzony wyjątek ma miejsce w innym wątku. Istnieje wiele przypadków, w których wątek umierający jest ponownie uruchamiany automatycznie (najsłynniejszym z nich jest EDT Swinga w niektórych systemach OS/JVM: w przypadku śmierci EDT ponownie uruchamia się nowy EDT). – SyntaxT3rr0r

14

Można wyjątek że ma się (w tym przypadku Boolean) wartość:

public class ValueException extends Exception { 
    final boolean value; 

    public ValueException(boolean value, String message) { 
     super(message); 
     this.value = value; 
    } 

    public boolean getValue() { 
     return value; 
    } 
} 
0

Choć możliwe jest, aby napisać kod w taki sposób, że wyjątek i wartość można wyprowadzić od wywołania funkcji (patrz powyższe posty), NIGDY nie powinno się tego robić przy odpowiednim kodowaniu.

Chciałbym zobaczyć link do dokumentacji tego interfejsu API. Interfejsy API powinny nadać priorytet przejrzystości. Zgłaszanie wyjątku i zwracanie wartości pozostawia pytanie, czy zwracana wartość jest bezpieczna w użyciu, czy jest niepoprawna.

Pamiętaj, że bloki try/catch to INNA metoda obsługi wyjątków. Nie przekazują one wyjątku do metody wywołującej, ale obsługują ją wewnętrznie w sposób, który programista uzna za właściwy.

Jeśli, dla celów debugowania, musisz zobaczyć wynikową wartość w przypadku wyjątku, to pomysł Bohemiana działa dobrze.

Powiązane problemy