当异常出现时,我为什么要写throw呢?

本文关键字:throw 为什么 异常 | 更新日期: 2023-09-27 18:05:23

为什么我应该在catch块中写入throw关键字来在异常无论如何都会上升的情况下产生异常?

当异常出现时,我为什么要写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