1

今天看到这段代码:

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() 是否引发异常。这意味着它的行为不同于我提供的其他两个代码替代方案,其中base.Current不会在 OnCurrentRead() 引发异常的情况下被调用。

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

4

1 回答 1

1

在原始代码中,ifCurrent是一个属性,它的实现在异常被重新抛出之前执行。

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

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

于 2013-04-15T21:27:10.813 回答