建议在finally块中使用业务逻辑吗? 我必须在工作结束时发送电子邮件通知(无论是否成功)。我可以将电子邮件逻辑放在finally块中吗?
答案 0 :(得分:1)
我能想到的主要危险是finally块能够以静默方式吞下异常并从try块本身返回值。
例如,
try {
doSomethingFancy();
} finally {
sendEmail();
}
如果doSomethingFancy抛出异常,您将尝试发送电子邮件。如果以某种方式发送电子邮件失败,sendEmail可能会抛出异常。此异常将“覆盖”原始抛出的异常,您将永远不会看到它。它会消失。
你可以用更多的try / catch块来防御性地编写这个,但要注意......
答案 1 :(得分:1)
理想情况下,您应该在Try块中使用业务逻辑,而Finally块应该包含任何清理任务或任何必须发生的事情,无论try块是成功还是失败。您还需要确保finally块中的代码不会导致任何异常,否则Steven提到,原始异常将丢失(如果有的话)。
答案 2 :(得分:0)
如果您打算将错误条件发送到指定的电子邮件ID,您可以在catch块中执行此操作。 finally块通常用于资源的优雅释放。我不建议在finally块中发送电子邮件或执行任何业务规则。
答案 3 :(得分:0)
在我看来,
try {
doSomethingFancy();
catch(Exception ex) {
logError(ex);
}
sendMail();
这是完美的模式。最后块只应用于清除try块中的代码可能留下的混乱。