这两个try / catch / throw语句是否相同?

时间:2013-10-01 17:30:14

标签: c# exception

鉴于以下陈述:

try
{
    ... some code ...
}
catch
{
    ... some cleanup code ...
    throw;
}

try
{
    ... some code ...
}
catch (Exception ex)
{
    ... some cleanup code ...
    throw ex;
}

这些操作是否相同,或者第一个是否会引发新的异常?

4 个答案:

答案 0 :(得分:4)

他们不一样。在第二个版本中,堆栈信息丢失。

这里有更详细的解释:http://winterdom.com/2002/09/rethrowingexceptionsinc

从该网站:

  

在[第二段]代码[..]中,你不是重新抛出ex,只是仅使用相同的异常对象实例开始一个新的异常流。

答案 1 :(得分:3)

前者抛出原始异常;后者引发了一个新的例外。它们的行为大致相同,只是前者保留原始堆栈跟踪,而后者只有从重新抛出异常的位置开始堆栈跟踪。

答案 2 :(得分:1)

有两种差异

首先,你是正确的,第二个导致新的异常与新的堆栈跟踪一起抛出。这将导致您丢失有价值的调试信息,永远不应该这样做。第二个例子的正确方法是

try
{
    ... some code ...
}
catch (Exception) //You can include the "ex" if you need it in your cleanup code
{
    ... some cleanup code ...
    throw; //Don't use the "ex" here
}

第二个区别是,第一个示例将捕获的第二个示例将不会有少量异常。主要是这些异常是从非CLR兼容代码抛出的异常。无法从C#代码中抛出非Exception派生的异常。

如果您想在将其添加到异常之前添加其他信息,则可以抛出新异常,并将旧异常作为InnerException

添加
try
{
    ... some code ...
}
catch (Exception ex)
{
    ... some cleanup code ...
    throw new MyCustomException("Some useful information", ex);
}

答案 3 :(得分:0)

没有。根据我的经验,虽然不多,但我尝试了两种解决方案,第二种似乎只捕获指定的异常,尽管第一种会遇到任何异常。希望这会有所帮助。