两者有什么区别
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) }
不管第二个显示的是一条消息。
当前回答
还有一点我没看到有人说:
如果你没有在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);
}
其他回答
throw重新抛出捕获的异常,保留堆栈跟踪,而throw new exception丢失捕获的异常的一些细节。
通常使用throw本身来记录异常,而不完全处理它。
BlackWasp有一篇很好的文章,标题是c#中抛出异常。
第二个示例将重置异常的堆栈跟踪。第一个最准确地保留了异常的起源。
此外,您还打开了原始类型,这是了解实际出错的关键……如果第二个属性是功能所必需的——例如,添加扩展信息或用特殊类型(如自定义的'HandleableException')重新包装,那么只需确保InnerException属性也设置了!
还有一点我没看到有人说:
如果你没有在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);
}
如果您愿意,您可以抛出一个新的异常,并将原始异常设置为内部异常。
第一个保存原始的stacktrace:
try { ... }
catch
{
// Do something.
throw;
}
第二个选项允许您更改异常和/或消息和其他数据的类型:
try { ... } catch (Exception e)
{
throw new BarException("Something broke!");
}
还有第三种传递内部异常的方法:
try { ... }
catch (FooException e) {
throw new BarException("foo", e);
}
我建议使用:
如果您想在错误情况下做一些清理,而不破坏信息或添加关于错误的信息,则使用第一种方法。 如果您想添加关于错误的更多信息,则使用第三个。 如果您想隐藏信息(不受信任的用户),则使用第二种方法。