我正在用C#编写自定义类,如果人们在某些方法中输入了错误的输入,我会抛出一些例外。如果抛出异常,抛出后方法中的任何代码仍会被执行吗?我必须在投掷后休息一下,还是抛出总是退出方法?
答案 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)
除了您的实际问题之外:您可能希望重新考虑使用例外情况向用户提供验证信息。
提高异常是昂贵的资源和缓慢的。如果您需要应用许多验证规则,那么请为这些规则编写特定代码 - 您应该只依赖异常处理来处理您不期望的事情。