在抛出异常后,我是否需要使用return语句(C++和C#)?

47

我有一个会生成异常的函数。例如以下代码:

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#中的情况是什么?


5
这是一个无返回值的函数,所以你不需要返回任何值。 - Vond Ritz
1
不,你不需要任何返回。 - Andy Prowl
2
抛出异常后,您不需要返回,因为throw会为您返回。 - Patashu
4
抛出异常会沿着调用栈向上冒泡到下一个异常处理程序,因此不需要返回。 - Phil Murray
5个回答

65

throw通常会导致函数立即终止,因此即使你在其后面放置了任何代码(在同一代码块中),该代码也不会执行。这适用于C++和C#。然而,如果你在try块内抛出异常并且该异常被捕获,则执行将在相应的catch块中继续进行,如果有finally块(仅适用于C#),则无论是否抛出异常都将执行。总之,在throw后面立即跟着的任何代码都永远不会被执行。

(请注意,在try/catch中直接使用throw通常是设计问题-异常是为了跨函数传播错误,而不是在函数内处理错误。)


技术上讲,你可以在那里放置一些东西,但它永远不会执行。 - Angew is no longer proud of SO
@Angew:好的,我重新表达了我的回答。 :-) - Aasmund Eldhuset
1
加个+1 :-) 顺便提一下,C++ 中没有 finally - Angew is no longer proud of SO
然而,微软制作了一些 MS 特定的等效物来解决最终缺失的问题,我认为它是 __finally,但似乎没有 GCC 的等效物。 - osirisgothra
@osirisgothra: 显然是这样,但它似乎与常规的C++异常无关(正如你所指出的,也不可移植)。 - Aasmund Eldhuset

3
严格来说,抛出异常并不总是立即终止函数执行...就像在这种情况下一样。
try {

     throw new ApplicationException();


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

} catch (Exception ex) {

}

然后,还有最后的代码块 - 但执行完后程序将退出。

所以不需要返回结果。


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

0

如果是无返回值方法,则永远不需要使用返回指令。

如果使用了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
}

0

在调用throw之后,该方法将立即返回,并且其后的任何代码都不会被执行。如果在try / catch块中没有捕获到任何异常,这也同样适用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接