题
我正在写一个自定义中的类C#我投掷几个例外情况,如果人们得到的输入错误的,在一些方法。如果异常,将任何代码的方法之后扔仍然可以执行?我必须要把休后扔掉,或者不会扔总是戒烟的方法?
解决方案
当你 扔 一个例外,下一代码,以获得执行任何抓住块,涵盖了就扔在方法(如果有的话)然后, 最后块 (如果有的话)。你可以有一个尝试,试一试-赶上,一试-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)将任何在throw后的方法的代码的执行吗结果 是。如果异常是一个尝试,然后匹配的catch块或finally块中的代码里面将被执行。如果没有try块则没有。到最近的封闭控制分支最后,捕获或(在vb)例外滤波器方框堆栈。
(2)我必须把断裂后扔?点击 没有,从来没有做到这一点。 throw语句的结束点是不可到达;投掷被视为由编译器goto语句。立即抛出下面的语句是不可达,将不会执行。
<强>(3)是否投掷总是退出方法吗结果 没有。如果扔在尝试和尝试有一个匹配的catch块,然后catch块可以“吃”的例外。只有当不存在catch块不会例外做一个非本地goto语句调用堆栈。
如果您对此有更多的问题,我建议你阅读C#规范;所有这种行为是明确记载。
最后,它听起来像你扔“愚蠢的”例外,如“嘿愚蠢的来电者,我告诉你,永远不会给我的数据”。这是伟大的,因为它可以防止错误的来电。但是,如果你这样做,你应该确保调用者有了解你的期望的一些方法!如果呼叫者无法弄清楚你是否打算抛出或不基于你的文档,那么你还没有做出愚蠢的异常,你做了一个棘手的例外。请参见 http://blogs.msdn.com/ericlippert /archive/2008/09/10/vexing-exceptions.aspx 获得的信息。
如果你用一个try代码... 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
顺便到你的实际问题:你可能想用异常来提供验证信息返回给用户重新思考
。提高例外是昂贵的资源向和缓慢的。如果你有一些你需要申请然后写这些特定的代码验证规则 - 你应该只依赖于异常处理的事情,你没有预料