我可以在Finally块中使用业务逻辑吗?

时间:2010-08-28 05:24:01

标签: c#-3.0 try-catch-finally

建议在finally块中使用业务逻辑吗? 我必须在工作结束时发送电子邮件通知(无论是否成功)。我可以将电子邮件逻辑放在finally块中吗?

4 个答案:

答案 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块中的代码可能留下的混乱。