Почему vavr Попытаемся контейнер ловит Throwable, но не Exception?

голоса
0

Я не эксперт в системе типа Java и обработки исключений. Но я нашел в так что мы должны поймать только исключения, но не Throwable-ые годы.

Вот ссылка: Разница между использованием метательного и исключениями в попытке поймать

В библиотеке Vavr я нашла этот исходный код:

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);
    }
}

Будет ли у меня есть какие-либо вопросы, в будущем, если я буду использовать этот контейнер? Буду ли я пропустить некоторые важные исключения, которые могут возникнуть во время выполнения функции «в»?

Задан 02/12/2019 в 21:56
источник пользователем
На других языках...                            


3 ответов

голоса
2

Throwableэто суперкласс Exception, то есть catch (Throwable var)отлавливает исключения , а также. Поэтому код в vavr правильно - каждый раз , когда есть какой - либо Throwableвыброшен он будет обернут в Try.Failure.

Ответил 02/12/2019 в 22:00
источник пользователем

голоса
1

Обратите внимание , что ответ в связанном посте говорится:

Вы должны , как правило , не делать это, за исключением , возможно , на самом высоком «поймать всех» уровень в потоке , в котором вы хотите войти или иным образом обрабатывать абсолютно все , что может пойти не так .

Упор мое.

Это, скорее всего , намерение здесь. Это tryобертка означала для обработки всех и позволить пользователю решить , что они хотят иметь дело и как. Кажется , что они собираются для конструкции , как в Scala , Tryчтобы позволить вам обрабатывать исключения , не вручную их ловить. Для того , чтобы работать и быть последовательным, все должны быть обработаны таким же образом, или вы хотите иметь некоторые исключения , требующие , чтобы быть пойманным, и другие, которые обрабатываются , как этот класс намерен.

Что касается

Буду ли я пропустить некоторые важные исключения, которые могут возникнуть во время выполнения функции «в»?

Вы не пропустите их. Они возвращаются , завернутые в Try.Failure, и вы можете справиться с ними , то после получения ошибки.

Ответил 02/12/2019 в 22:01
источник пользователем

голоса
1

Причина , по которой Throwableбыл использован вместо Exception, потому что мы хотим , чтобы наши Tryобъекты также поймать Errorс. Это его как модель наследования Exceptionsи Errorsвыглядит следующим образом :

введите описание изображения здесь

Если бы мы только поймать Exceptions, IOErrorобрушится наш код и мешает нам использовать силу в Tryцепи:

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

При ловле Throwable, это IOErrorбудет поймано, и мы сможем выполнить onFailureметод. Если бы мы только поймать Exception, исполнение остановился бы на первой линии, и onFailureникогда не будет выполнена.

Ответил 16/01/2020 в 17:05
источник пользователем

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