抛出异常后我是否必须休息?

时间:2009-06-13 06:20:55

标签: c# .net exception break throw

我正在用C#编写自定义类,如果人们在某些方法中输入了错误的输入,我会抛出一些例外。如果抛出异常,抛出后方法中的任何代码仍会被执行吗?我必须在投掷后休息一下,还是抛出总是退出方法?

6 个答案:

答案 0 :(得分:31)

当你throw出现异常时,下一个要执行的代码是覆盖方法中的抛出的任何catch块(如果有的话),finally block(如果有的话)。你可以尝试一下,尝试捕捉,尝试捕捉终极或尝试终极。然后,如果未处理异常,由catch块重新抛出或根本没有捕获,则将控制权返回给调用者。例如,您将从此代码中获得“Yes1,Yes2,Yes3”...

try
{
    Console.WriteLine("Yes1");
    throw (new Exception());
    Console.WriteLine("No1");

}
catch
{
    Console.WriteLine("Yes2");
    throw;
    Console.WriteLine("No2");
}
finally
{
    Console.WriteLine("Yes3");
}

Console.WriteLine("No3");

答案 1 :(得分:27)

投掷将向上移动,从而退出该方法。

答案 2 :(得分:4)

我建议您使用调试器逐步执行程序,然后您将自己查看正在发生的事情。对学习非常有用!

答案 3 :(得分:2)

我来到这里寻找原帖的答案,几乎错过了Eric Lippert发布的非常有价值的答案。以下是他在评论中发布的答案:

将其分为三个问题。

(1)抛出后方法中的任何代码都会被执行吗?
是。如果异常在try中,则匹配catch块或finally块内的代码将被执行。如果没有尝试阻止则NO。控制分支到最近的封闭finally,catch或(在vb中)异常过滤器阻塞堆栈。

(2)我必须在投掷后休息一下吗?
不,永远不要那样做。 throw语句的结束点无法访问;抛出被编译器视为goto。无法访问抛出后的语句,永远不会执行。

(3)投掷总是退出方法吗?
没有。如果throw是try并且try有一个匹配的catch块,那么catch块可以" eat"例外。只有在没有catch块的情况下,异常才能在调用堆栈中执行非本地操作。

如果您对此有更多疑问,我建议您阅读C#规范;所有这些行为都有明确的记录。

最后,听起来你正在投掷"愚蠢的"例外情况,就像嘿嘿啰嗦的来电者一样,我告诉过你永远不要给我那些数据"。这很棒,因为它可以防止来电者的错误。但是如果你这样做,你应该确保调用者有某种方式知道你的期望!如果来电者无法根据您的文档弄清楚您是否会投掷,那么您还没有做出任何愚蠢的例外,您已经做了一个令人烦恼的例外。有关详细信息,请参阅http://blogs.msdn.com/ericlippert/archive/2008/09/10/vexing-exceptions.aspx

答案 4 :(得分:1)

如果您已将代码包装在Try ... Catch ... Finally块中,则Finally下的代码将始终执行。例如:

Try
  ' do some stuff here
  ' Examine user input
  If user input isn't valid
      Throw new exception
Catch
   Throw ' Just re-throws the same exception
Finally
   ' This code will execute, no matter what - exception or not
End Try

答案 5 :(得分:1)

除了您的实际问题之外:您可能希望重新考虑使用例外情况向用户提供验证信息。

提高异常是昂贵的资源和缓慢的。如果您需要应用许多验证规则,那么请为这些规则编写特定代码 - 您应该只依赖异常处理来处理您不期望的事情。