两者有什么区别

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可以为调试目的保留调用堆栈。

throw重新抛出捕获的异常,保留堆栈跟踪,而throw new exception丢失捕获的异常的一些细节。

通常使用throw本身来记录异常,而不完全处理它。

BlackWasp有一篇很好的文章,标题是c#中抛出异常。