2014-02-18 35 views
3

为什么有人会这样做?我不明白。我可以删除这个try-catch块而不影响代码吗?为什么会有人做Catch(Exception e){throw e; }?

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

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

有时要记录或东西,再次引发,但肯定在这种情况下,它是安全的删除 –

+2

它实际上最好删除这是因为现在它重写抛出异常对象正在跺出栈跟踪 –

回答

8

为什么有人会这样做?

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

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

throw声明,单独使用时,保留异常调用堆栈信息。这就是说,如果你没有其他逻辑(如日志记录),绝对没有理由去捕捉异常。只有当您需要记录/处理它们,或者您可以合理地处理错误并正确恢复时才应该发现异常。

+0

我喜欢这个答案,因为你说异常不应该被捕获,而是被其他逻辑阻止。 – Measuring

0

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

0

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

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

2

可能是因为throw e重置堆栈跟踪(所以你的错误似乎从方法,其中应用try块发起)

情况下 开发商不希望实际调用栈暴露给用户

然而,只是抛出保存堆栈跟踪。所以,这没有任何意义,除非你有其他代码上面扔:

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

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