鉴于以下陈述:
try
{
... some code ...
}
catch
{
... some cleanup code ...
throw;
}
和
try
{
... some code ...
}
catch (Exception ex)
{
... some cleanup code ...
throw ex;
}
这些操作是否相同,还是第一个会导致引发新异常?
他们不一样。在第二个版本中,堆栈信息丢失了。
更详细的解释在这里:http ://winterdom.com/2002/09/rethrowingexceptionsinc
从那个网站:
在 [第二段] 代码 [..] 中,您不会重新抛出 ex,而只是使用相同的异常对象实例开始一个新的异常流。
前者抛出原来的异常;后者抛出一个新的异常。它们的行为通常相同,只是前者保留原始堆栈跟踪,而后者仅具有从重新引发异常的位置开始的堆栈跟踪。
有两个区别
首先你是正确的,第二个导致一个新的异常被抛出一个新的堆栈跟踪。这将导致您丢失有价值的调试信息,并且永远不应该这样做。做第二个例子的正确方法是
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 兼容代码抛出的。没有办法抛出一个非Exception
派生异常。
一件事如果您想在冒泡之前向异常添加其他信息,您可以抛出一个新异常并将旧异常作为InnerException
try
{
... some code ...
}
catch (Exception ex)
{
... some cleanup code ...
throw new MyCustomException("Some useful information", ex);
}
不。根据我的经验,虽然不多,但我已经尝试了两种解决方案,第二个似乎只捕获指定的异常,尽管第一个会捕获任何异常。希望这可以帮助。