Dlaczego kontenerów Spróbuj wyławia vavr za Throwable, ale nie wyjątek?

głosy
0

Nie jestem ekspertem w systemie typu Java i obsługi wyjątków. Ale uważam, że w tak, że powinniśmy złapać tylko wyjątki, ale nie Throwable jest.

Oto link: Różnica między używaniem Throwable i wyjątek w try catch

W bibliotece Vavr za znalazłem ten kod źródłowy:

public interface Try<T> extends Value<T>, Serializable {
long serialVersionUID = 1L;

static <T> Try<T> of(CheckedFunction0<? extends T> supplier) {
    Objects.requireNonNull(supplier, supplier is null);

    try {
        return new Try.Success(supplier.apply());
    } catch (Throwable var2) {
        return new Try.Failure(var2);
    }
}

Czy mam żadnych problemów w przyszłości, jeśli będę korzystać z tego pojemnika? Będę tęsknić krytyczne wyjątki, które mogą wystąpić podczas wykonywania „” z funkcją?

Utwórz 02/12/2019 o 21:56
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
2

Throwablejest nadklasą Exception, co oznacza catch (Throwable var)połów wyjątki, jak również. W związku z tym kod w vavr jest poprawny - gdy istnieje jakiekolwiek Throwablewyrzucane będzie owinięta w Try.Failure.

Odpowiedział 02/12/2019 o 22:00
źródło użytkownik

głosy
1

Uwaga jaka odpowiedź w połączonej postu mówi:

Nie powinno się na ogół to zrobić, z wyjątkiem być może na najwyższym „catch all” poziom wątku, w którym chcesz się zalogować lub inaczej obsłużyć absolutnie wszystko, co może pójść źle .

Kopalnia nacisk.

Że jest tu prawdopodobnie intencją. Jest to trywrapper przeznaczona do obsługi wszystko i pozwolić użytkownikowi zdecydować, co chcą zajmować iw jaki sposób. Wygląda na to, że będziemy dla konstruktu jak Scala Tryaby obsłużyć wyjątki bez konieczności ręcznego ich wzrok. Do tego, aby pracować i być spójne, wszystko powinno być traktowane w ten sam sposób, czy chcesz mieć pewne wyjątki, która chciałaby zostać złapany i innych, które są traktowane jako ta klasa zamierza.

Co się tyczy

Będę tęsknić krytyczne wyjątki, które mogą wystąpić podczas wykonywania „” z funkcją?

Nie przegap ich. Są one zostać zwrócone zawinięte w Try.Failure, można obsługiwać je następnie po otrzymaniu błąd.

Odpowiedział 02/12/2019 o 22:01
źródło użytkownik

głosy
1

Powodem, dla którego Throwableużyto zamiast Exception, dlatego chcemy nasze Tryobiekty, aby również skorzystać Errors. To jego sposób model dziedziczenia Exceptionsi Errorswygląda następująco:

wprowadzić opis obrazu tutaj

Gdybyśmy tylko złapać Exceptions, IOErrorby rozbić nasz kod i uniemożliwiają nam stosując siłę Tryłańcucha:

Try.of(() -> throw new IOError(null))
  .onFailure(() -> /* Do something to fix the IOError */);

Kiedy wzrok Throwable, to IOErrorzostanie złapany, a my będziemy w stanie wykonać onFailuremetodę. Gdybyśmy tylko złapać Exception, wykonanie byłby zatrzymany na jednej linii, i onFailurenigdy nie będzie stracony.

Odpowiedział 16/01/2020 o 17:05
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more