2009-06-13 109 views
20

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

+1

将其分解为三个问题。 (1)抛出后的方法中的任何代码是否会被执行?是。如果异常是在try中,那么匹配catch块或finally块中的代码将被执行。如果没有尝试块,则没有。控制最后分支到最近的包围,捕获或(在vb中)异常过滤块阻止堆栈。 – 2009-06-13 15:11:59

+2

(2)投掷后我必须休息吗?不,不要那样做。 throw语句的结束点不可访问;一个throw被编译器视为goto。紧跟在一个throw之后的语句不可达,并且永远不会执行。 – 2009-06-13 15:13:02

+1

(3)抛出是否总是退出该方法?没有。如果投掷是在尝试中,并且尝试有一个匹配的catch块,那么catch块可以“吃”这个异常。只有在没有catch块的情况下,异常才会执行非本地的调用堆栈。 – 2009-06-13 15:13:58

回答

30

当您的throw出现异常时,下一个要执行的代码是覆盖该方法(如果有)的任何catch代码块,然后是finally block(如果有的话)。你可以尝试一下,尝试一下,最后尝试一下,或者试一试。然后,如果没有处理异常,由catch块重新抛出或根本没有捕获异常,则控制返回给调用者。例如,你会得到“支持1,YES2,是3”从这个代码...

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"); 
27

抛出将向上移动堆栈,从而退出该方法。

1

如果你已经包裹在一个尝试你的代码... CATCH ... 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 
1

顺便到你的实际问题:你可能想用异常来提供验证信息返回给用户重新思考。

提高例外是昂贵的资源明智和缓慢。如果你有一些你需要应用的验证规则,那么就为它们编写特定的代码 - 你应该仅仅依靠对你不期望的事情的异常处理。

3

我建议使用调试程序浏览您的程序,然后您会看到自己正在发生的事情。对学习非常有用!

2

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

将其分解为三个问题。

(1)执行throw之后的方法中的任何代码是否会被执行?
是的。如果异常是在try中,那么匹配catch块或finally块中的代码将被执行。如果没有尝试块,则没有。控制最后分支到最近的包围,捕获或(在vb中)异常过滤块阻止堆栈。

(2)投掷后我必须休息吗?
不,不要那样做。 throw语句的结束点不可访问;一个throw被编译器视为goto。紧跟在一个throw之后的语句不可达,并且永远不会执行。

(3)一次抛出总是退出该方法吗?
NO。如果投掷是在尝试中,并且尝试有一个匹配的catch块,那么catch块可以“吃”这个异常。只有在没有catch块的情况下,异常才会执行非本地的调用堆栈。

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

最后,这听起来像是在抛出“骨头头”的异常,如“嘿骨头打电话的人,我告诉过你永远不要给我那些数据”。这很好,因为它可以防止呼叫者中的错误。但是如果你这样做,你应该确保调用者有一些方法来知道你的期望!如果调用者不能根据你的文档判断你是否要抛出,那么你还没有做出头颅的例外,你已经做了一个令人烦恼的例外。详情请参阅http://blogs.msdn.com/ericlippert/archive/2008/09/10/vexing-exceptions.aspx

相关问题