Предложение Fail fast finally в Java

Есть ли способ обнаружить из предложения finally, что исключение находится в процессе создания?

См. Пример ниже:


try {
    // code that may or may not throw an exception
} finally {
    SomeCleanupFunctionThatThrows();
    // if currently executing an exception, exit the program,
    // otherwise just let the exception thrown by the function
    // above propagate
}

или игнорировать одно из исключений - единственное, что вы можете сделать?

В C++ он даже не позволяет игнорировать одно из исключений и просто вызывает terminate (). Большинство других языков используют те же правила, что и java.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
0
1 007
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Нет, я так не считаю. Блок catch будет выполнен до завершения до блока finally.

try {
    // code that may or may not throw an exception
} catch {
// catch block must exist.
finally {
    SomeCleanupFunctionThatThrows();
// this portion is ran after catch block finishes
}

В противном случае вы можете добавить объект synchronize (), который будет использовать код исключения, который вы можете проверить в блоке finally, что поможет вам определить, запущено ли исключение в отдельном потоке.

это неправильно, нет абсолютно никакого требования иметь блок catch.

shsteimer 16.09.2008 07:28

Если функция выдает ошибку, и вы хотите перехватить исключение, вам придется заключить функцию в блок try, это самый безопасный способ. Итак, в вашем примере:

try {
    // ...
} finally {
    try {
        SomeCleanupFunctionThatThrows();
    } catch(Throwable t) { //or catch whatever you want here
        // exception handling code, or just ignore it
    }
}
Ответ принят как подходящий

Установите переменную флага, затем проверьте ее в предложении finally, например:

boolean exceptionThrown = true;
try {
   mightThrowAnException();
   exceptionThrown = false;
} finally {
   if (exceptionThrown) {
      // Whatever you want to do
   }
}

Ты слишком быстр ... ты получил мой ответ

martinatime 16.09.2008 00:39

Вы имеете в виду, что хотите, чтобы блок finally действовал по-разному в зависимости от того, успешно ли завершился блок try?

Если это так, вы всегда можете сделать что-то вроде:

boolean exceptionThrown = false;
try {
    // ...
} catch(Throwable t) {
    exceptionThrown = true;
    // ...
} finally {
    try {
        SomeCleanupFunctionThatThrows();
    } catch(Throwable t) { 
        if (exceptionThrown) ...
    }
}

Однако это становится довольно запутанным ... вы можете подумать о способе реструктуризации вашего кода, чтобы сделать это ненужным.

Если вы обнаружите, что делаете это, возможно, у вас проблемы с дизайном. Идея блока «finally» заключается в том, что вы хотите, чтобы что-то было сделано независимо от того, как завершается метод. Мне кажется, что вам вообще не нужен блок finally, и нужно просто использовать блоки try-catch:

try {
   doSomethingDangerous(); // can throw exception
   onSuccess();
} catch (Exception ex) {
   onFailure();
}

Другие вопросы по теме