为什么有人会使用Catch(Exception e) { throw e; }这种写法?

3

为什么有人要这样做呢?我不明白。如果我删除这个try-catch块,是否会影响代码?

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

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

有时候你想要记录一些东西并重新抛出异常,但是在这种情况下删除是安全的。 - Kevin DiTraglia
2
最好将其删除,因为按照现在的写法,重新抛出e异常对象会覆盖掉您的堆栈跟踪。 - Kevin DiTraglia
4个回答

8

为什么有人要这样做?

你不应该这样做。最接近的情况是如果你想要添加一些日志记录,那么你应该这样写:

try
{
  /// Do something
}
catch (Exception e)
{
   LogException(e); // Do some logging
   throw; // Don't use throw e
}
throw语句单独使用时,可以保留异常的调用堆栈信息。
话虽如此,如果没有其他逻辑(例如日志记录),就没有必要捕获该异常。只有在需要记录/处理异常或者可以合理地处理错误并进行恢复时,才应该捕获异常。

我喜欢这个答案,因为你说异常不应该被捕获,而是通过额外的逻辑来预防。 - Measurity

2

可能有这样的情况,开发人员不想向用户公开实际调用堆栈,因为throw e会重置堆栈跟踪(所以您的错误似乎源自应用 try 块的方法)

然而,简单地抛出仍会保留堆栈跟踪。因此,除非您在 throw 之上有其他代码,否则这没有任何意义:

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

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

0

那个try/catch块没有意义。只有在计划对其进行操作时才需要捕获异常,但在这种情况下什么也没做(仅抛出异常并不算做做了什么,因为这总是会发生的)。你可以安全地将其删除。


0

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

所以,一般来说,不要 try catch 所有东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接