【问题标题】:object returned after an exception?异常后返回的对象?
【发布时间】:2010-10-24 18:25:15
【问题描述】:
   int somefunction(bool a)
    {
      try
      {
        if(a)
        throw Error("msg");
        return 2;
      }
     catch (Error const & error)
     {
       //do i need to return anything here??
       //return -1;
     }
    }

【问题讨论】:

    标签: c++ exception return-value


    【解决方案1】:

    您需要返回某些内容或重新抛出异常(或抛出新异常)。您只需使用关键字即可重新抛出相同的异常

    throw
    

    在 catch 块中,之后没有异常或参数。

    【讨论】:

      【解决方案2】:

      如果你不在那里返回任何东西,那么被调用者之后可能会做错事,因为返回值将是未定义的,并且可能会得到一个有效的返回码!试试这个:

      printf("%i\n", somefunction(false));
      printf("%i\n", somefunction(true));
      

      输出:

      2
      2293512
      

      编译器也会对此给出警告(例如“控制到达非无效函数的结尾”)。

      【讨论】:

        【解决方案3】:

        函数返回一个int,所以你需要返回一个int。另一种方法是不在函数中捕获异常并让它传播。

        【讨论】:

          【解决方案4】:

          首先,通过在第 9 行捕获您在第 6 行抛出的异常,您正在滥用异常。您基本上是在使用“if”语句执行正常程序流程可以执行的操作。通过将以这种方式抛出的异常添加到您的代码库中,将不再将异常用于真正的异常情况。当有一个简单的替代方案时,不要从你的函数中抛出异常。

          也就是说,您可以通过两种方式退出 int 函数:

          • 返回int
          • 抛出异常

          【讨论】:

          • 如果您认为这是误用,请说明原因。
          • 假设 if(a) 操作也能抛出异常?那么他的代码就有意义了。但我认为他只是发布一个简单的例子来支持他的问题,而不是真正的代码。
          • 即便如此,最好只为从下面抛出的异常保留捕获,并仅使用“如果”来处理更可控的情况。
          • 如果您有通用代码,则不会。例如,他可能想要测试“如果 (a) 的评估抛出异常或返回 true,则执行某项操作”,在这种情况下,他所拥有的似乎是执行“某项操作”的合理方式。
          • 代码可能会不必要地使用异常,但这也是一个简洁的例子,清楚地说明了这个问题。将 try 块的主体替换为“return someFunctionThatMightThrow(a)”会减轻您的抱怨,但它也可能会产生一些“请发布其余代码”的回复。 :)
          【解决方案5】:

          除非您重新抛出异常,否则您需要返回一个 int(可能是一个错误标记值)。

          【讨论】:

            【解决方案6】:

            根据您的编译器/编译器设置,您将无法编译返回 int 的函数,该函数可能没有返回值,即“执行到达非 void 函数的末尾”。所以是的,你必须返回一个值,除非你想重新抛出异常。

            【讨论】:

              猜你喜欢
              • 2017-02-24
              • 1970-01-01
              • 2019-08-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多