今天我看到了这段代码:
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块上抛出异常。
答案 0 :(得分:1)
在原始代码中,如果Current
是属性,则在重新抛出异常之前执行 的实现
在您提出的两个备选方案中,如果Current
抛出异常,则OnCurrentRead()
的任何可能实现都不会执行。
那就是说,恕我直言,原始代码有一些严重的代码味道。我更喜欢你的第二种选择(但从技术上讲,它不等同于原版)。