Как заставить код работать только в том случае, если было создано исключение?
У меня есть попытка с несколькими различными уловами после него. У меня есть код "очистки", который должен запускаться только в случае возникновения исключения. Я мог бы добавить один и тот же код к каждому исключению, но это становится кошмаром обслуживания. В принципе, я хотел бы что-то вроде оператора finally, но для его запуска только в случае исключения.
это возможно?
5 ответов
к сожалению, для этого нет прямой поддержки. Как насчет чего-то вроде этого?--2-->
boolean successful = false;
try {
// do stuff
successful = true;
} catch (...) {
...
} finally {
if (!successful) {
// cleanup
}
}
единственное, что я могу придумать, это установить переменную в каждом улове, а затем проверить эту переменную в конце.
псевдокод:
Boolean caught = false;
try {
//risky code here
catch(err) {
caught = true;
// Do other stuff
}
catch(err) {
caught = true;
// Do other stuff
}
catch(err) {
caught = true;
// Do other stuff
}
finally {
if (caught) {
// Do clean up
}
}
я мог бы добавить один и тот же код к каждому исключению, но это становится кошмаром обслуживания.
или если вы вычеркнете "исключение":
я мог бы добавить один и тот же код к каждому [месту], но это становится кошмаром обслуживания.
это то, для чего созданы методы.
private void cleanup() { /* clean up */ }
...
try {
// oh noes
} catch (MyException me) {
cleanup();
} catch (AnotherException ae) {
cleanup();
}
ремонт мороки нет!
почему бы вам просто не использовать simple try & catch?
try
{
foo();
}
catch(Exception1 e1)
{
dealWithError(1);
}
catch(Exception2 e2)
{
dealWithError(2);
}
catch(Exception3 e3)
{
dealWithError(3);
}
...
private void dealWithError(int i)
{
if(i == 1) // deal with Exception1
else if(i == 2) // deal with Exception2
else if(i == 3) // deal with Exception3
}
вы можете попробовать обернуть два слоя обработчиков исключений и перестроить исключение после выполнения общей обработки:
try {
try {
// your code goes here
} catch (Throwable t) {
// do common exception handling for any exception
throw t;
}
} catch (NullPointerException nx) {
// handle NPE
} catch (Throwable t) {
// handle any other exception
}
Не уверен,что мне действительно нравится это решение... похоже на взлом. Я бы предпочел, чтобы исключение явно обрабатывалось в каждом экземпляре, даже если это означает повторение вызова какой-то общей функции очистки.