今天看到这段代码:
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 块上引发异常的某些语言规范有关。