抛出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处理来处理您未预料到的事情。
- 键值对作为枚举
- 从内存流中读取存储的PDF
- 使用C#和JScript汇总表
- 检测您的操作系统在C#中安装了哪个版本的IE?
- System.Threading.Timer vs System.Threading.Thread.Sleep resolution – .NET Timer不使用系统时钟分辨率
- 如何从其他项目添加对共享代码项目(.shproj)的引用
- CancellationToken.ThrowIfCancellationRequested后出现故障与已取消的任务状态
- 简洁轻量的API:.NET中的REST + JSON
- NET 4.0 SpinWait方法与4.0之前的SpinWait()有何不同?