鉴于以下陈述:
try
{
... some code ...
}
catch
{
... some cleanup code ...
throw;
}
和
try
{
... some code ...
}
catch (Exception ex)
{
... some cleanup code ...
throw ex;
}
这些操作是否相同,或者第一个是否会引发新的异常?
答案 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)
没有。根据我的经验,虽然不多,但我尝试了两种解决方案,第二种似乎只捕获指定的异常,尽管第一种会遇到任何异常。希望这会有所帮助。