两者有什么区别
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,两者都用于抛出或重新抛出异常,当你只是简单地记录错误信息而不想向调用者发送任何信息时,你只需在catch和leave中记录错误。
但是,如果你想向调用者发送一些关于异常的有意义的信息,你可以使用throw或throw ex。现在,throw和throw ex之间的区别是,throw保留了堆栈跟踪和其他信息,但throw ex创建了一个新的异常对象,因此原始的堆栈跟踪丢失了。
什么时候应该使用throw和throw e呢?在一些情况下,您可能需要重新抛出异常,例如重置调用堆栈信息。
例如,如果方法在库中,而您希望对调用代码隐藏库的详细信息,则不一定希望调用堆栈包含关于库中私有方法的信息。在这种情况下,您可以捕获库的公共方法中的异常,然后重新抛出它们,以便调用堆栈从这些公共方法开始。
最重要的区别是第二个表达式删除了异常的类型。异常类型在捕获异常方面起着至关重要的作用:
public void MyMethod ()
{
// both can throw IOException
try { foo(); } catch { throw; }
try { bar(); } catch(E) {throw new Exception(E.message); }
}
(...)
try {
MyMethod ();
} catch (IOException ex) {
Console.WriteLine ("Error with I/O"); // [1]
} catch (Exception ex) {
Console.WriteLine ("Other error"); // [2]
}
如果foo()抛出IOException,[1]捕获块将捕获异常。但是当bar()抛出IOException时,它将被转换为普通异常,并且不会被[1]捕获块捕获。
扔;重新抛出原始异常并保留其原始堆栈跟踪。
把交货;抛出原始异常,但重置堆栈跟踪,在catch块之前销毁所有堆栈跟踪信息。
永远不要写throw ex;
抛出新的异常(ex.Message);更糟糕。它创建了一个全新的Exception实例,丢失了异常的原始堆栈跟踪及其类型。(例如,IOException)。 此外,一些异常包含额外的信息(例如,ArgumentException.ParamName)。 抛出新的异常(ex.Message);也会毁掉这些信息。
在某些情况下,您可能希望将所有异常包装在自定义异常对象中,以便您可以提供有关抛出异常时代码正在做什么的附加信息。
为此,定义一个继承Exception的新类,添加所有四个异常构造函数,并可选地添加一个额外的构造函数,该构造函数接受一个InnerException以及其他信息,并抛出您的新异常类,将ex作为InnerException参数传递。通过传递原始的InnerException,可以保留所有原始异常的属性,包括堆栈跟踪。
Throw;:重新抛出原始异常并保持异常类型。
抛出新异常();:重新抛出原始异常类型并重置异常堆栈跟踪
Throw ex;:重置异常堆栈跟踪并重置异常类型
throw重新抛出捕获的异常,保留堆栈跟踪,而throw new exception丢失捕获的异常的一些细节。
通常使用throw本身来记录异常,而不完全处理它。
BlackWasp有一篇很好的文章,标题是c#中抛出异常。