【问题标题】:Is there a reason to throw an exception twice?有理由两次抛出异常吗?
【发布时间】:2013-04-10 21:48:06
【问题描述】:

调试生产代码我遇到了一些我以前从未见过的东西,并且不知道它的有效用途。在我们的一个控制器的几种方法中,我们有 try-catch 块。有趣的是,其中一个 catch 中有 2 个 throw 语句。

有任何理由有 2 个 throw 语句吗?如果是这样,在什么情况下这有意义?

        try
        {
           //statements
        }
        catch (SoapException se)
        {
            //Log statement
            return null;
        }
        catch (Exception ex)
        {
            //Log statement
            throw;
            throw;
        }

【问题讨论】:

  • 我只是好奇,throw 语句真的像帖子中显示的那样是连续的,还是在实际代码中只是逻辑上连续的?
  • 它们实际上是连续的,这也是为什么我看到它时感到如此奇怪的原因。我在想,就像这里的答案一样,第二次投掷永远不会达到(即使达到了,又有什么意义呢?)所以这很令人困惑。
  • 感谢大家的理智检查(即答案)。

标签: c# exception-handling try-catch throw


【解决方案1】:

不,没有理由throw 两次。第二个throw 永远无法到达。

它也类似于拥有

public int GetNumber()
{
    return 1;
    return 2; // Never reached
}

更新

Resharper 是检查此类情况的好工具。

在这种情况下,第二个throw 会变灰,并告诉您它无法访问。

【讨论】:

    【解决方案2】:

    连续两次抛出异常绝对没有任何目的。第二个throw 永远无法联系到,它很可能是错字,或者是经过编辑但从未完成并因此被遗忘的代码。

    【讨论】:

      【解决方案3】:

      在您展示的示例中,两个 throw 语句没有任何意义。一旦第一个被击中,它就会开始返回调用堆栈,直到它被捕获。让两个人有所不同的唯一方法是,第一个是有条件的,或者在第二个被击中之前被抓住。

          try
          {
             //statements
          }
          catch (SoapException se)
          {
              //Log statement
              return null;
          }
          catch (Exception ex)
          {
              //Log statement
              if (condition)
                  throw;
              throw;
          }
      

          try
          {
             //statements
          }
          catch (SoapException se)
          {
              //Log statement
              return null;
          }
          catch (Exception ex)
          {
              //Log statement
              try
              {
                   throw;
              }
              catch (Exception)
              {
                   //Handle first thrown exception.
              }
              throw;
          }
      

      【讨论】:

      • 最后一段代码很漂亮。你确定你没有从insert my company name here的源代码中提取出来吗?
      • 最后一个代码段中的第一个throw 是否合法?该模式很奇怪,但如果在最后一个 try 中有一些特定的 catch 语句,那么该模式可能会有用处;想法是,如果在第一个 catch (Exception ex) 之前没有捕获到异常,则某种异常将会冒泡,但只有在最后一个 @987654329 中没有异常处理程序时才会到达最后一个 throw @先抛出自己的异常。我希望 C# 和 vb.net 对需要处理异常但知道它永远不会解决它的代码有一个很好的语法。
      猜你喜欢
      • 2018-08-19
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-24
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      相关资源
      最近更新 更多