两者有什么区别
try { ... }
catch{ throw }
and
try{ ... }
catch(Exception e) {throw new Exception(e.message) }
不管第二个显示的是一条消息。
两者有什么区别
try { ... }
catch{ throw }
and
try{ ... }
catch(Exception e) {throw new Exception(e.message) }
不管第二个显示的是一条消息。
当前回答
Throw;:重新抛出原始异常并保持异常类型。
抛出新异常();:重新抛出原始异常类型并重置异常堆栈跟踪
Throw ex;:重置异常堆栈跟踪并重置异常类型
其他回答
第二个示例将重置异常的堆栈跟踪。第一个最准确地保留了异常的起源。
此外,您还打开了原始类型,这是了解实际出错的关键……如果第二个属性是功能所必需的——例如,添加扩展信息或用特殊类型(如自定义的'HandleableException')重新包装,那么只需确保InnerException属性也设置了!
抛出一个新的异常会破坏当前的堆栈跟踪。
扔;将保留原始的堆栈跟踪,并且几乎总是更有用。该规则的例外情况是当您希望将异常包装在自己的自定义异常中时。你应该这样做:
catch(Exception e)
{
throw new CustomException(customMessage, e);
}
Throw;:重新抛出原始异常并保持异常类型。
抛出新异常();:重新抛出原始异常类型并重置异常堆栈跟踪
Throw ex;:重置异常堆栈跟踪并重置异常类型
Throw或Throw ex,两者都用于抛出或重新抛出异常,当你只是简单地记录错误信息而不想向调用者发送任何信息时,你只需在catch和leave中记录错误。
但是,如果你想向调用者发送一些关于异常的有意义的信息,你可以使用throw或throw ex。现在,throw和throw ex之间的区别是,throw保留了堆栈跟踪和其他信息,但throw ex创建了一个新的异常对象,因此原始的堆栈跟踪丢失了。
什么时候应该使用throw和throw e呢?在一些情况下,您可能需要重新抛出异常,例如重置调用堆栈信息。
例如,如果方法在库中,而您希望对调用代码隐藏库的详细信息,则不一定希望调用堆栈包含关于库中私有方法的信息。在这种情况下,您可以捕获库的公共方法中的异常,然后重新抛出它们,以便调用堆栈从这些公共方法开始。
还有一点我没看到有人说:
如果你没有在catch{}块中做任何事情,尝试一下…捕捉是没有意义的。我经常看到这样的情况:
try
{
//Code here
}
catch
{
throw;
}
或者更糟:
try
{
//Code here
}
catch(Exception ex)
{
throw ex;
}
坏的:
try
{
//Code here
}
catch(Exception ex)
{
throw new System.Exception(ex.Message);
}