我有以下代码:
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中以绿色下划线标出。当光标悬停在带下划线的文本上时,消息显示“检测到无法访问的代码”。这引出了我在标题行中陈述的问题:
在方法中抛出异常会导致方法返回吗?
答案 0 :(得分:9)
好吧,它导致方法执行退出,是的。异常被抛出堆栈,最接近捕获它的方法。如果它不影响执行流程,那将毫无意义。
这与“正常”返回的方法不同 - 即没有例外。所以假设调用方法有:
Point foo = bar / baz;
Console.WriteLine("Done");
在这种情况下,如果除法运算符抛出异常,则Console.WriteLine()
调用将不会执行。相反, 异常将在此方法中被捕获,或异常将传播到该方法的调用者等。
(finally
块也将在此过程中执行。)
可能值得阅读"handling and throwing exceptions"的MSDN指南。
答案 1 :(得分:2)
不完全是。抛出异常时,如果被捕获,它将跳转到方法中的处理代码。从那里它可以做任何你想做的事。如果在示例中未被捕获,它将跳转到调用此方法的方法,并且永远不会“返回”值。它也永远不会返回执行抛出异常后的返回行。
答案 2 :(得分:2)
不,因为抛出异常不返回。
如果在函数内部没有处理异常,它将导致立即退出函数,将控制传递给程序中的第一个点,在该点处将捕获异常,即处理。 (如果没有得到处理,导致程序突然死亡。)
由于函数将在抛出后退出,因此返回语句是无用的,因为它永远不会被访问。,
答案 3 :(得分:1)
在方法中抛出异常会导致方法返回吗?
是。正在中断方法的执行,因此方法返回它的执行流程。但是没有返回值,您使用return
语句定义它。除了相应的throw new
和catch
块之外,当前方法中finally
之后没有行。所以你不必在抛出异常后返回值。
Visual Studio强调了无法访问的代码块。在您的特定情况下,return Point.Origin;
语句永远不会被执行,因此您可以将其删除。
答案 4 :(得分:0)
是的,抛出异常会导致该方法立即返回。
但是,这不是正常的回报。例如,没有返回值。从因抛出异常而返回的方法捕获控件的唯一方法是使用异常处理程序。