Как заставить код работать, только если было сгенерировано исключение? - PullRequest
9 голосов
/ 27 сентября 2011

У меня есть попытка с несколькими различными уловами после этого. У меня есть некоторый код «очистки», который должен запускаться только в случае возникновения исключения. Я мог бы добавить один и тот же код к каждому исключению, но это становится кошмаром обслуживания. По сути, я бы хотел что-то вроде оператора finally, но чтобы оно выполнялось только в случае возникновения исключения.

Возможно ли это?

Ответы [ 5 ]

18 голосов
/ 27 сентября 2011

К сожалению, прямой поддержки этому нет.Как насчет чего-то подобного

boolean successful = false;
try {
    // do stuff
    successful = true;
} catch (...) {
    ...
} finally {
    if (!successful) {
        // cleanup
    }
}
1 голос
/ 27 сентября 2011

Я могу добавить один и тот же код к каждому исключению, но это станет кошмаром обслуживания.

Или, если вы исключите «исключение»:

Я мог бы добавить один и тот же код в каждое [место], но это становится кошмаром обслуживания.

Для этого и созданы методы.

private void cleanup() { /* clean up */ }

...

try {
    // oh noes

} catch (MyException me) {
    cleanup();
} catch (AnotherException ae) {
    cleanup();
}

Устранены трудности с обслуживанием!

1 голос
/ 27 сентября 2011

Единственное, о чем я могу думать, это установить переменную в каждом улове, а затем проверить эту переменную в finally.

псевдокод:

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
   }

}
0 голосов
/ 27 сентября 2011

Вы можете попробовать обернуть два слоя обработчиков исключений и перебросить исключение после выполнения общей обработки:

    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
    }

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

0 голосов
/ 27 сентября 2011

Почему бы вам просто не использовать простую попытку и поймать?

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...