为什么我应该在catch块中写入throw关键字以在异常升级时冒出异常?
答案 0 :(得分:6)
如果您想要执行一些特殊的日志记录或错误处理逻辑,主要是这样做。很多时候,如果你需要泡泡的例外,可以简单地使用try{} finally{}
,最后是处理所使用的任何资源。
它也可以用于根据调试进行分支(因此您的用户看不到难看的堆栈跟踪):
catch(Exception e)
{
#if DEBUG
throw;
#else
Log(e);
#endif
}
答案 1 :(得分:3)
因此,您可以向异常添加一些信息,或者更改其类型,然后重新抛出它。
例如,如果您尝试解析从LDAP服务器或其他内容中提取的员工编号:
try
{
Convert.ToInt32(employeeNumber);
}
catch(FormatException fe)
{
throw new ArgumentException("Employee Number" +employeeNumber +" is not valid. ", fe);
}
答案 2 :(得分:1)
你不对。
例如:
try
{
// Something throws an exception
}
catch
{
}
那会静音任何异常,所以“没有例外会冒泡”。
也许你的意思是,为了冒泡某些方法或属性的调用者的异常,必须尝试/ catch。 不是。
对于 IDisposable 实施,您可以使用使用语句,因此对象将释放基础资源:
using(disposableObject)
{
}
如果其他人没有实现 IDisposable ,您可以使用 try / finally :
try
{
// Code
}
finally
{
// Do something in any case: even if an exception has been thrown.
}
无论如何,请注意在catch块中重新抛出异常通常会丢失堆栈跟踪内容这一事实,所以如果你需要一些带有异常跟踪的错误报告,你需要采取在考虑尝试/最终方法 - 或使用如果聚会中有IDisposable对象 - (了解更多关注此链接:http://blogs.msdn.com/b/jmstall/archive/2007/02/07/catch-rethrow.aspx)
答案 3 :(得分:1)
如果您未在catch块中使用throw
关键字,则异常将不冒泡。如果你在catch块中所做的只是throw
(不是throw new
),那么你不需要catch
块,如果没有finally
块,你可以完全放弃try
。