在一个方法中抛出异常会导致该方法返回吗?

9

I have the following code:

public static Point operator /(Point point, double value)
    {
        if (value == 0)
        {
            throw new DivideByZeroException("Cannot divide by zero");
            return Point.Origin;
        }
        return new Point(point.X / value, point.Y / value, point.Z / value);
    }

在Visual Studio中,第一个返回语句(return Point.Origin;)被用绿色下划线标记。当鼠标悬停在下划线文本上时,会显示消息“检测到无法访问的代码”。这引出了我在标题中提出的问题:

在方法内抛出异常是否会导致该方法返回?


2
谢谢,我现在明白了:在方法中抛出异常会导致程序的执行流程要么进入方法中适当的异常处理程序(例如catch或finally语句),如果有的话,要么退出该方法并沿调用堆栈向上走,直到被处理。无论哪种情况,在throw new Exception之后和任何catch/finally块之外的方法中的其他代码都不会被执行。为了澄清和回答这个问题,该方法不返回值,但它确实“返回”,也就是说程序执行返回到调用该方法的方法。 - Jackson Dean Goodwin
5个回答

11

好的,它会导致该方法的执行“退出”,是的。异常被向上传递到最近捕获它的方法。如果它不影响执行流程,那么它将是毫无意义的。

这与方法“正常”返回(即没有异常)不同。假设调用方法如下:

Point foo = bar / baz;
Console.WriteLine("Done");
在这种情况下,如果除法运算符抛出异常,Console.WriteLine()调用将不会执行。相反,该方法将捕获异常,或者将异常传播给该方法的调用方等等。(在此过程中也会执行finally块。)建议阅读MSDN指南"处理和抛出异常"

3
不可以,因为抛出异常并不是一种返回。
如果函数内部没有处理异常,它将导致立即退出函数,将控制权传递到程序中第一个捕获(处理)该异常的点。(如果未被处理,会导致程序突然死亡。)
由于函数在抛出异常后将退出,因此返回语句是无用的,因为它永远不会被执行。

2

不完全正确。当抛出异常时,如果被捕获,它会跳转到方法内的处理代码。从那里它可以做任何你想做的事情。如果像你的例子一样未被捕获,它将跳转到调用此方法的方法,并永远不会“返回”一个值。它也永远不会返回执行在抛出异常后的return语句。


1
在一个方法中抛出异常会导致该方法返回吗?
是的。方法的执行被中断,因此方法返回其执行流程。但如果您使用了return语句定义,则不会返回任何值。当前方法中throw new语句后面的代码行都不会被执行,除非对应的catchfinally块。因此,在抛出异常后,您不必返回值。
Visual Studio会下划线标记代码块,以便检测到无法到达的代码块。在您的特定情况下,return Point.Origin;语句永远不会被执行,因此可以将其删除。

这真的是类似于“返回”的行为吗?因为从技术上讲,该函数并没有返回一个值,而是发出了一个异常信号。我错了吗? - cheesemacfly
你说得对。我们正在谈论执行流程的返回,而不是返回值。导致方法返回可以被视为导致返回执行流程导致返回值:前者为真,后者为假。 - Ilya Ivanov
@cheesemacfly - 一个异常会中止方法,使返回值变得不重要。 - H H
@HenkHolterman 我也同意,但问题是在问它是否导致方法返回。所以我仍然不确定是肯定还是否定。(但我猜这更多是一个单词含义的问题,而不是其他什么问题) - cheesemacfly
它肯定不会以正常方式返回值。 - H H
@IlyaIvanov - 但不是在调用点... 异常引入了完全分离的控制流,涉及到finallycatch块。 - H H

0

是的,抛出异常会导致方法立即返回。

但是,这不是正常的返回。例如,没有返回值。唯一从由于抛出异常而返回的方法中捕获控制的方法是具有异常处理程序。


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