为什么有人会做Catch(例外e){throw e; }?

时间:2014-02-18 19:53:43

标签: c# error-handling try-catch

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

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

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

4 个答案:

答案 0 :(得分:8)

  

为什么有人会这样做?

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

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

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

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

答案 1 :(得分:2)

可能是开发人员不希望向用户公开实际调用堆栈的情况,因为throw e 重置堆栈跟踪(因此您的错误会出现来源于应用try块的方法)

但是,只是抛出保留堆栈跟踪。所以,除非你有以上其他代码抛出,否则这没有任何意义:

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

是的,您应该删除try catch。您应该捕获特定类型的异常,如果您尝试捕获,然后抛出,原始异常的调用堆栈信息将丢失,并且调用堆栈信息对于调试非常重要。

所以,一般来说,不要试着抓住每件事。