【问题标题】:How to catch a rethrown exception?如何捕获重新抛出的异常?
【发布时间】:2026-01-05 03:05:02
【问题描述】:

我有以下代码:

try
{
    await _policyService.QueuePayment();
}
catch (Exception ex)
{
    var slackError = new ErrorNotificationMessage("{ex.Message}");

    await Notify(slackError);
}

如果异常是安全异常,我想提供更多详细信息并将其记录到 Slack,因此我将这个 try/catch 块扩展如下:

 try
{
    await _policyService.QueuePayment();
}
catch (SecurityException ex)
{
    throw new Exception("detailed message", ex);
}
catch (Exception ex)
{
     var slackError = new ErrorNotificationMessage("{ex.Message}");

     await Notify(slackError);
}

但是,这不会捕获重新抛出的异常并将其记录到 Slack。我在这里错过了什么?

【问题讨论】:

  • "我在这里遗漏了什么?" -- catch 语句捕获在相应的try 块中抛出的异常。一个catch 块中引发的异常不会被后续catch 块捕获。
  • 谢谢@canton7 - 所以我这里需要2个trys?
  • 或者重构出Notify 逻辑——它目前只是在catch (Exception ex) 块中,而您正在跳过箍以通过该块获取所有异常。把它移到一个单独的辅助方法中,然后catch (SecurityException ex) { await NotifyError(new Exception("detailed message", ex); } catch (Exception ex) { await NotifyError(ex); }

标签: c# .net error-handling


【解决方案1】:

正如 @canton7 在 cmets 中已经提到的那样,您需要在 catch (SecurityException ex) 中添加一个 try-catch 才能捕获它。但是,正如它也提到的那样,这在这里没有意义。包装异常只是为了更改错误消息也不是一种常见的(或者更确切地说是正确的)做法。

只需使用标准布尔逻辑:

try
{
    await _policyService.QueuePayment();               
}
catch (Exception ex)
{
    var message = ex is SecurityException ? "Some very important message" : ex.Message;
    var slackError = new ErrorNotificationMessage(message);
    await Notify(slackError);
}

【讨论】:

    【解决方案2】:

    但是,这不会捕获重新抛出的异常并将其记录到 Slack。我在这里错过了什么?

    当我们显式抛出异常时,可以通过将方法调用包含在 try catch 块中,在调用者端捕获它。我们不能在同一方法中从 catch 块中抛出和捕获异常,除非我们添加另一个在这里实际上没有意义的 try catch。

    您应该做的是直接抛出该异常,例如:

    try
     {
         await _policyService.QueuePayment();
                
     }
     catch (Exception ex)
     {
          if(ex is SecurityException)
          {
              // for security exception do something different
          }
          else
          {
              var slackError = new ErrorNotificationMessage("{ex.Message}");
    
              await Notify(slackError);
          }
    
          
     }
    

    【讨论】:

    • @CamiloTerevinto 对,我已经更新了帖子