Желательно ли иметь бизнес-логику в блоке finally? Я должен отправить уведомление по электронной почте, когда работа закончена (независимо от того, успешна она или нет). Могу ли я разместить логику электронной почты в блоке finally?
Основная опасность, которую я могу себе представить, заключается в том, что блок finally имеет возможность молча проглатывать исключения и возвращать значения из самого блока try.
Например,
try {
doSomethingFancy();
} finally {
sendEmail();
}
если doSomethingFancy выдает исключение, вы попытаетесь отправить электронное письмо. Если по какой-либо причине отправка электронной почты не удалась, sendEmail может вызвать исключение. Это исключение «отменит» исходное исключение, и вы его никогда не увидите. Он просто исчезнет.
Вы могли бы обойти это с помощью дополнительных блоков try/catch, но имейте в виду...
В идеале ваша бизнес-логика должна находиться в блоке Try, а блок finally должен содержать любую задачу очистки или любую вещь, которая должна произойти независимо от успеха или неудачи блока try. Вы также должны убедиться, что код в блоке finally не вызывает никаких исключений, иначе, как упомянул Стивен, исходное исключение будет потеряно, если оно есть.
Вы можете сделать это в блоке catch, если вы собираетесь отправить сообщение об ошибке на указанный адрес электронной почты. Блок finally обычно используется для постепенного освобождения ресурсов. Я не рекомендую отправлять электронную почту или выполнять какие-либо бизнес-правила в блоке finally.
На мой взгляд,
try {
doSomethingFancy();
catch(Exception ex) {
logError(ex);
}
sendMail();
идеальный образец для этого. Блок finally следует использовать только для очистки беспорядка, который мог оставить код в блоке try.