【问题标题】:Why would anyone do Catch (Exception e) { throw e; }?为什么有人会 Catch (Exception e) { throw e; }?
【发布时间】:2014-03-18 19:22:28
【问题描述】:

为什么会有人这样做?我不明白。我可以在不影响代码的情况下删除这个 try-catch 块吗?

try
{
    Collection<SvnLogEventArgs> svnLog = GetSVNRevisionsLog(lastRevision, currentRevision, svnUrl);

    svnInfo = PopulateOutput(svnLog, svnUrl.ToString());
}
catch (Exception e)
{
    throw e;
}

【问题讨论】:

  • 有时你想记录什么然后重新抛出,但是在这种情况下它是安全的删除
  • 实际上最好删除它,因为现在重新抛出 e 异常对象会破坏您的堆栈跟踪

标签: c# error-handling try-catch


【解决方案1】:

那个 try/catch 块没有意义。如果你打算用它做某事,你只需要捕获异常,但在这种情况下什么都不做(只是抛出异常不算做某事,因为无论如何都会这样做)。您可以安全地删除它。

【讨论】:

    【解决方案2】:

    为什么会有人这样做?

    你不应该这样做。如果你想添加一些日志记录,你应该最接近,在这种情况下你应该写:

    try
    {
      /// Do something
    }
    catch (Exception e)
    {
       LogException(e); // Do some logging
       throw; // Don't use throw e
    }
    

    throw 语句单独使用时,会保留异常调用堆栈信息。

    话虽如此,如果您没有其他逻辑(例如日志记录),则绝对没有理由捕获异常。仅当您需要记录/处理异常,或者您可以合理地处理错误并正确恢复时,才应捕获异常。

    【讨论】:

    • 我喜欢这个答案,因为你说异常不应该被捕获,而是被额外的逻辑阻止。
    【解决方案3】:

    是的,您应该删除 try catch。应该捕获具体类型的异常,另外,如果try-catch,然后throw,原来异常的调用栈信息会丢失,调用栈信息对于调试非常重要。

    所以,一般来说,不要试图抓住所有东西。

    【讨论】:

      【解决方案4】:

      可能是 开发人员不想向用户公开实际调用堆栈,因为throw e 重置堆栈跟踪(因此您的错误似乎源于from 应用 try 块的方法)

      但是,只需抛出保留堆栈跟踪。因此,除非您在上面抛出其他代码,否则这没有任何意义:

      try
      {
          Collection<SvnLogEventArgs> svnLog =
                GetSVNRevisionsLog(lastRevision, currentRevision, svnUrl);
      
          svnInfo = PopulateOutput(svnLog, svnUrl.ToString());
      }
      catch (Exception e)
      {
          throw;
      }
      

      【讨论】:

        猜你喜欢
        • 2012-06-04
        • 1970-01-01
        • 1970-01-01
        • 2010-12-14
        • 1970-01-01
        • 1970-01-01
        • 2013-02-10
        • 2020-07-26
        相关资源
        最近更新 更多