【问题标题】:Try inside catch to ensure finally executes尝试在 catch 中确保最终执行
【发布时间】:2013-11-04 07:20:57
【问题描述】:

我必须处理队列中的项目。

从队列中删除项目是手动调用Queue.DeleteMessage。无论处理是否成功,这都需要发生。

var queueMessage = Queue.GetMessage();

try
{
    pipeline.Process(queueMessage);
}
catch (Exception ex)
{
    try
    {
        Logger.LogException(ex);
    }
    catch { }
}
finally
{
    Queue.DeleteMessage(queueMessage);
}

问题:

失败时,我将错误记录到某个数据存储中。如果此日志记录失败(可能数据存储不可用),我仍然需要从队列中删除该消息。

我已将LogException 调用封装在另一个try catch 中。这是正确的方式还是执行的事情?

【问题讨论】:

    标签: c# .net exception-handling try-catch try-catch-finally


    【解决方案1】:

    以下代码就足够了。即使catch 块中抛出异常,finally 块也会执行。

    var queueMessage = Queue.GetMessage();    
    try
    {
        pipeline.Process(queueMessage);
    }
    catch (Exception ex)
    {
        Logger.LogException(ex);
    }
    finally
    {
        Queue.DeleteMessage(queueMessage);//Will be executed for sure*
    }
    

    【讨论】:

    • finally blocks execute even when exception is thrown in catch block. - 我没有意识到这一点。完美,谢谢。
    • @Alireza it remains unhandled 除非它在其他地方被发现
    • 你提出的和 PO 的不同之处在于他的代码可以捕获任何可捕获的异常
    【解决方案2】:

    finally 块总是执行,即使它抛出一个未处理的错误(除非它结束应用程序)。所以是的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-29
      • 2013-08-10
      • 2012-08-26
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      相关资源
      最近更新 更多