在 finally 块中包含业务逻辑是否可取?当工作结束(无论成功与否)时,我必须发送电子邮件通知。我可以将电子邮件逻辑放在 finally 块中吗?
问问题
1288 次
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 回答