Как заставить код работать только в том случае, если было создано исключение?

У меня есть попытка с несколькими различными уловами после него. У меня есть код "очистки", который должен запускаться только в случае возникновения исключения. Я мог бы добавить один и тот же код к каждому исключению, но это становится кошмаром обслуживания. В принципе, я хотел бы что-то вроде оператора 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
    }

Не уверен,что мне действительно нравится это решение... похоже на взлом. Я бы предпочел, чтобы исключение явно обрабатывалось в каждом экземпляре, даже если это означает повторение вызова какой-то общей функции очистки.