Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么rethrow在finally块上捕获异常_C#_Exception_Exception Handling - Fatal编程技术网

C# 为什么rethrow在finally块上捕获异常

C# 为什么rethrow在finally块上捕获异常,c#,exception,exception-handling,C#,Exception,Exception Handling,今天我看到了这段代码: get { Exception ex = null; try { try { OnCurrentRead(); } catch (Exception _) { ex = _; } return base.Current; } finally { if (ex != null) throw ex; } } 我想知道这种异常处理需要什么。删除堆栈跟踪 捕获从oncurrentrad()引发的异常并将其分

今天我看到了这段代码:

get
{
   Exception ex = null;
   try
   {
       try { OnCurrentRead(); }
       catch (Exception _) { ex = _; }
       return base.Current;
   }
   finally { if (ex != null) throw ex; }
}
我想知道这种异常处理需要什么。删除堆栈跟踪

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

与下面的代码有什么区别

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

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

似乎第一个代码示例确保在任何情况下都会调用base.Current(它是一个属性),无论OnCurrenRead()是否引发异常。这意味着它与我提供的另外两个代码选项不同,如果oncurrentrad()抛出异常,则不会调用base.Current


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

在原始代码中,如果
Current
是一个属性,它的实现将在重新调用异常之前执行

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


也就是说,IMHO,原始代码有一些严重的代码气味。我更喜欢您的第二个备选方案(但从技术上讲,它并不等同于原始方案)。

在原始代码中,如果
Current
是一个属性,那么它的实现将在重新调用异常之前执行

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


也就是说,IMHO,原始代码有一些严重的代码气味。我更喜欢你的第二个选择(但从技术上讲,它并不等同于原来的选择)。

我认为有些人不知道他们在做什么。我认为有些人不知道他们在做什么。这是真的。此代码是当前类的“当前属性getter”,它调用基类的“当前属性getter”。我完全忘记了调用另一个属性或方法的语义和副作用。显然,这段代码确保在抛出任何异常之前调用base属性。但我仍然想知道,除此之外,这是否是出于任何原因处理异常的特殊设计。除非
base.Current
有一些副作用,即使在
oncurrenred()
抛出时也需要发生,否则我会怀疑代码没有用处。也许其他人会插嘴,但这对我来说是一个陌生的“设计”。这是真的。此代码是当前类的“当前属性getter”,它调用基类的“当前属性getter”。我完全忘记了调用另一个属性或方法的语义和副作用。显然,这段代码确保在抛出任何异常之前调用base属性。但我仍然想知道,除此之外,这是否是出于任何原因处理异常的特殊设计。除非
base.Current
有一些副作用,即使在
oncurrenred()
抛出时也需要发生,否则我会怀疑代码没有用处。也许其他人会插嘴,但这对我来说是一个陌生的“设计”。