【问题标题】:do I need a return after throwing exception (c++ and c#)抛出异常后我需要返回吗(C++ 和 C#)
【发布时间】:2013-05-27 02:22:59
【问题描述】:

我有一个生成异常的函数。比如下面的代码:

void test()
{
    ifstream test("c:/afile.txt");
    if(!test)
    { 
         throw exception("can not open file");
    }
    // other section of code that reads from file.
}

抛出异常后需要return吗?

c#中是什么情况?

【问题讨论】:

  • 这是一个 void 函数,所以你不需要返回任何值。
  • 不,你不需要任何回报
  • 抛出异常后不需要返回,因为 throw 会为你返回。
  • 抛出会将调用堆栈冒泡到下一个异常处理程序,因此不需要返回。

标签: c# c++ exception


【解决方案1】:

throw 通常会导致函数立即终止,所以即使你在它之后放置任何代码(在同一个块内),它也不会执行。这适用于 C++ 和 C#。但是,如果您在 try 块内引发异常并且异常被捕获,则将在适当的 catch 块中继续执行,如果存在 finally 块(仅限 C#),则无论是否是否抛出异常。无论如何,紧跟在throw 之后的任何代码都不会被执行。

(请注意,在 try/catch 中直接包含 throw 通常是一个设计问题 - 异常是为跨函数冒泡错误而设计的,而不是用于函数内的错误处理。)

【讨论】:

  • 嗯,从技术上讲,你可以有一些东西,但它永远不会执行。
  • @Angew:够公平;我重新制定了我的答案。 :-)
  • 有一个 +1 :-) 值得一提的是 C++ 中没有 finally。
  • 然而,微软做了一些特定于 ms 的等价物来解释最后丢失的东西,我认为它是 __finally,但似乎没有一个用于 gcc
  • @osirisgothra: Apparently so,但它似乎与常规 C++ 异常无关(并且正如您所指出的那样,不可移植)。
【解决方案2】:

调用throw 后,该方法将立即返回,并且不会执行其后的任何代码。如果任何异常被抛出并且没有被try / catch 块捕获,这也是正确的。

【讨论】:

    【解决方案3】:

    不,你不需要返回,因为抛出异常之后的代码不会被执行。

    【讨论】:

      【解决方案4】:

      如果它是一个 void 方法,你将永远不需要返回指令。

      那么你不能在 throw 指令之后放置任何东西,如果有东西被抛出,它将永远不会被使用

      void test()
      {
          ifstream test("c:/afile.txt");
          if(!test)
          { 
               throw exception("can not open file");
               // If there is code here it will never be reach !
          }
          // other section of code that reads from file.
          //if you place code here it will be reach only if you don"t throw an exception, so only if test == true in your case
      }
      

      【讨论】:

        【解决方案5】:

        严格来说,抛出不一定总是立即终止函数......就像在这种情况下,

        try {
        
             throw new ApplicationException();
        
        
        } catch (ApplicationException ex) {
            // if not re-thrown, function will continue as normal after the try/catch block
        
        } catch (Exception ex) {
        
        }
        

        然后是 finally 块 - 但之后它将退出。

        所以不,您不必返回。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-11
          • 2016-12-11
          • 1970-01-01
          • 1970-01-01
          • 2022-01-14
          相关资源
          最近更新 更多