7

我有以下代码:

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);
    }

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

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

4

5 回答 5

9

好吧,它会导致方法的执行退出,是的。异常被抛出堆栈,最接近捕获它的方法。如果它不影响执行流程,那将毫无意义。

这与“正常”返回的方法不同——即没有例外。所以假设调用方法有:

Point foo = bar / baz;
Console.WriteLine("Done");

在这种情况下,如果除法运算符抛出异常,Console.WriteLine()调用将不会执行。相反,要么在此方法中捕获异常,要么将异常传播到该方法的调用者,等等。

finally块也将沿途执行。)

可能值得阅读 MSDN guide to "handling and throwing exceptions"

于 2013-01-14T17:53:16.927 回答
2

不,因为抛出异常不是返回。

如果异常没有在函数内部处理,它将导致立即退出函数,将控制权传递到程序中将捕获异常的第一个点,即处理。(如果不处理会导致程序突然死亡。)

由于函数将在 throw 后退出,因此 return 语句是无用的,因为它永远不会到达。,

于 2013-01-14T17:56:52.470 回答
2

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

于 2013-01-14T17:53:19.387 回答
1

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

是的。方法的执行被中断,所以方法返回它的执行流程。但是没有返回值,您使用return语句定义了它。当前方法后面throw new的行没有被执行,除了对应的catchfinally块。所以你不必在抛出异常后返回值。

Visual Studio 强调了它检测到无法访问的代码块。在您的特定案例 return Point.Origin;中,语句永远不会被执行,因此您可以将其删除。

于 2013-01-14T17:51:49.547 回答
0

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

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

于 2013-01-14T17:53:01.423 回答