抛出exception后我是否必须rest?

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

当你抛出exception时,下一个要执行的代码是任何catch块,它覆盖方法中的抛出(如果有的话), finally块 (如果有的话)。 你可以尝试一下try-catch,try-catch-finally或者try-finally。 然后,如果未处理exception,由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"); 

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

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

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

将其分为三个问题。

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

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

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

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

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

如果您已将代码包装在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 

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

提高exception在资源方面是昂贵且缓慢的。 如果您需要应用许多validation规则,那么请为这些规则编写特定代码 – 您应该只依赖exception处理来处理您未预料到的事情。