Fail fast предложение наконец в Java - PullRequest
5 голосов
/ 16 сентября 2008

Есть ли способ обнаружить из условия 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.

Ответы [ 5 ]

14 голосов
/ 16 сентября 2008

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

boolean exceptionThrown = true;
try {
   mightThrowAnException();
   exceptionThrown = false;
} finally {
   if (exceptionThrown) {
      // Whatever you want to do
   }
}
10 голосов
/ 16 сентября 2008

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

try {
   doSomethingDangerous(); // can throw exception
   onSuccess();
} catch (Exception ex) {
   onFailure();
}
1 голос
/ 16 сентября 2008

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

try {
    // ...
} finally {
    try {
        SomeCleanupFunctionThatThrows();
    } catch(Throwable t) { //or catch whatever you want here
        // exception handling code, or just ignore it
    }
}
0 голосов
/ 16 сентября 2008

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

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

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

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

0 голосов
/ 16 сентября 2008

Нет, я не верю в это. Блок 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, что поможет вам определить, выполняется ли исключение в отдельном потоке.

...