为什么重新抛出finally块上的异常

时间:2013-04-15 21:20:31

标签: c# exception exception-handling

今天我看到了这段代码:

get
{
   Exception ex = null;
   try
   {
       try { OnCurrentRead(); }
       catch (Exception _) { ex = _; }
       return base.Current;
   }
   finally { if (ex != null) throw ex; }
}

我想知道这种异常处理的需要是什么。删除堆栈跟踪?

捕获OnCurrentRead()抛出的异常并将其分配给局部变量。该属性返回,但在finally块上,如果发现局部变量被分配了一个异常对象,则抛出此异常。哪个基本

与下面的代码有什么不同?

get
{
   try
   {
      OnCurrentRead();
      return base.Current;
   }
   catch(Exception ex) { throw ex; }
}

还是这个?

get
{
   OnCurrentRead();
   return base.Current;
}

更新

似乎第一个代码示例确保在每种情况下都会调用base.Current(它是一个属性),而OnCurrentRead()是否会抛出异常。这意味着它的 bahavior 与我提供的另外两个代码备选方案不同,其中如果OnCurrentRead()抛出异常,则不会调用base.Current。

我的问题是,这种异常处理只是用于实现对base.Current的调用,或者它与某些语言规范有关,它们返回一个值然后在finally块上抛出异常。

1 个答案:

答案 0 :(得分:1)

在原始代码中,如果Current是属性,则在重新抛出异常之前执行 的实现

在您提出的两个备选方案中,如果Current抛出异常,则OnCurrentRead() 的任何可能实现都不会执行。

那就是说,恕我直言,原始代码有一些严重的代码味道。我更喜欢你的第二种选择(但从技术上讲,它不等同于原版)。