1

在 finally 块中包含业务逻辑是否可取?当工作结束(无论成功与否)时,我必须发送电子邮件通知。我可以将电子邮件逻辑放在 finally 块中吗?

4

4 回答 4

1

我能想到的主要危险是 finally 块有能力默默地吞下异常并从 try 块本身返回值。

例如,

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

如果 doSomethingFancy 抛出异常,您将尝试发送电子邮件。如果以某种方式发送电子邮件失败,sendEmail 可能会抛出异常。此异常将“覆盖”原始抛出的异常,您将永远看不到它。它只会消失。

您可以使用更多的 try / catch 块来防御性地编写代码,但请注意......

于 2010-08-28T05:27:55.903 回答
1

理想情况下,您应该将业务逻辑放在 Try 块中,并且 finally 块应该包含任何清理任务或任何必须发生的事情,而不管 try 块的成功或失败。您还需要确保 finally 块中的代码不会导致任何异常,否则正如 Steven 所提到的,如果有的话,原始异常将丢失。

于 2010-08-28T05:37:48.717 回答
0

如果您打算将错误条件发送到指定的电子邮件 ID,则可以在 catch 块中执行此操作。finally 块通常主要用于资源的优雅释放。我不建议在 finally 块中发送电子邮件或执行任何业务规则。

于 2010-08-28T05:30:44.537 回答
0

在我脑海里,

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

是完美的模式。finally 块应该只用于清理 try 块中的代码可能留下的混乱。

于 2010-08-28T06:46:00.910 回答