Могу ли я иметь бизнес-логику в блоке «Наконец»? - PullRequest
0 голосов
/ 28 августа 2010

Желательно ли иметь бизнес-логику в блоке finally? Я должен отправить уведомление по электронной почте, когда работа закончена (независимо от того, успешна она или нет). Могу ли я разместить логику электронной почты в блоке finally?

Ответы [ 4 ]

1 голос
/ 28 августа 2010

В идеале вы должны иметь свою бизнес-логику в блоке Try, а блок finally должен содержать любую задачу очистки или любую вещь, которая должна произойти независимо от успеха или неудачи блока try. Вам также необходимо убедиться, что код в блоке finally не вызывает никаких исключений, в противном случае, как упомянул Стивен, исходное исключение будет потеряно, если оно есть.

1 голос
/ 28 августа 2010

Основная опасность, о которой я могу подумать, заключается в том, что блок finally имеет возможность тихо глотать исключения и возвращать значения из самого блока try.

Например,

try {
    doSomethingFancy();
} finally {
    sendEmail();
}

Если doSomethingFancy выдает исключение, вы попытаетесь отправить электронное письмо. Если отправка электронного письма не удалась, sendEmail может выдать исключение. Это исключение «переопределит» исходное выброшенное, и вы никогда его не увидите. Это просто исчезнет.

Вы можете кодировать это с защитой, используя больше блоков try / catch, но просто помните ...

0 голосов
/ 28 августа 2010

На мой взгляд,

try {
    doSomethingFancy();
catch(Exception ex) {
    logError(ex);
}
sendMail();

Это идеальный образец для этого.Блок finally следует использовать только для устранения ошибок, которые мог оставить код в блоке try.

0 голосов
/ 28 августа 2010

Вы можете сделать это в блоке catch в случае, если вы намереваетесь отправить условие ошибки на указанный электронный идентификатор. Блок finally обычно используется для постепенного освобождения ресурсов. Я не рекомендую отправлять электронную почту или выполнять какие-либо бизнес-правила в блоке finally.

...