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




Нет, я так не считаю. Блок 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, что поможет вам определить, запущено ли исключение в отдельном потоке.
Если функция выдает ошибку, и вы хотите перехватить исключение, вам придется заключить функцию в блок 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
}
}
Ты слишком быстр ... ты получил мой ответ
Вы имеете в виду, что хотите, чтобы блок 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();
}
это неправильно, нет абсолютно никакого требования иметь блок catch.