当异常出现时,我为什么要写throw呢?
本文关键字:throw 为什么 异常 | 更新日期: 2023-09-27 18:05:23
为什么我应该在catch块中写入throw关键字来在异常无论如何都会上升的情况下产生异常?
如果您想做一些特殊的日志记录或错误处理逻辑,您将主要这样做。很多时候,如果您需要异常冒泡,则可以简单地使用try{} finally{}
,最后是处置所使用的任何资源。
它也可以用来根据是否调试进行分支(这样你的用户就不会看到难看的堆栈跟踪):
catch(Exception e)
{
#if DEBUG
throw;
#else
Log(e);
#endif
}
所以您可以在异常中添加一些信息,或者更改其类型,然后重新抛出它。
例如,如果您试图解析从LDAP服务器或其他地方提取的员工编号:
try
{
Convert.ToInt32(employeeNumber);
}
catch(FormatException fe)
{
throw new ArgumentException("Employee Number" +employeeNumber +" is not valid. ", fe);
}
你不对。
例如:try
{
// Something throws an exception
}
catch
{
}
这将静音任何异常,所以"没有异常会冒泡"。
也许你的意思是,如果为了向某些方法或属性的调用者弹出异常而强制执行try/catch。。
对于IDisposable实现,您可以使用使用语句,因此object(s)将释放底层资源:
using(disposableObject)
{
}
对于其他没有实现IDisposable的,您可以使用try/finally:
try
{
// Code
}
finally
{
// Do something in any case: even if an exception has been thrown.
}
无论如何,要注意这样一个事实,即在catch块中重新抛出异常通常会丢失堆栈跟踪内容,所以如果您需要使用异常跟踪的错误报告,您需要考虑try/finally方法-或使用如果在party中有IDisposable对象-(点击此链接:http://blogs.msdn.com/b/jmstall/archive/2007/02/07/catch-rethrow.aspx了解更多信息)
如果在catch块中不使用throw
关键字,则异常将不冒泡。如果您在catch块中所做的一切都是throw
(而不是throw new
),那么您不需要catch
块,如果没有finally
块,您可以完全放弃try
。