无论如何,当异常被冒泡时,我为什么要写throw?

时间:2011-08-13 16:04:36

标签: c# exception-handling

为什么我应该在catch块中写入throw关键字以在异常升级时冒出异常?

4 个答案:

答案 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