我正在用C#编写一个自定义类,如果人们在某些方法中给出错误的输入,我会抛出一些例外。如果抛出异常,抛出后方法中的任何代码是否仍然会被执行?在投掷之后我是否必须休息一下,还是一定要抛出这个方法?抛出异常后我必须打破吗?
回答
当您的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");
抛出将向上移动堆栈,从而退出该方法。
如果你已经包裹在一个尝试你的代码... 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
顺便到你的实际问题:你可能想用异常来提供验证信息返回给用户重新思考。
提高例外是昂贵的资源明智和缓慢。如果你有一些你需要应用的验证规则,那么就为它们编写特定的代码 - 你应该仅仅依靠对你不期望的事情的异常处理。
我建议使用调试程序浏览您的程序,然后您会看到自己正在发生的事情。对学习非常有用!
我来到这里寻找原帖的答案,几乎错过了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。
- 1. 试用资源:我必须抛出或捕获close()方法的异常吗?
- 2. 我必须打开ngx_http_access_module吗?
- 3. 为什么调用函数时必须“抛出异常”?
- 4. 调用函数:未报告IOException异常必须声明抛出
- 5. Java异常必须被捕获或者声明抛出
- 6. 转换为List()抛出异常对象必须实现IConvertible
- 7. 未报告的异常java.lang.ClassNotFoundException;必须捕获或声明抛出
- 8. GetStringCritical()会抛出异常吗?
- 9. Java:可以抛出异常抛出异常吗?
- 10. 抛出异常后返回
- 11. 魔术异常抛出抛出异常
- 12. “必需”DataAnnotation抛出unHandled异常
- 13. 异常抛出异常
- 14. 抛出异常
- 15. 抛出异常
- 16. 抛出异常
- 17. 异常抛出
- 18. 打印空,但不抛出异常
- 19. OracleConnection在打开时抛出null异常()
- 20. 打杂抛出不确定的异常
- 21. 重新抛出异常好习惯吗?
- 22. 打开文件时会抛出IsolatedStorageFileStream异常吗?
- 23. 吞咽异常移除抛出它的性能打击吗?
- 24. 未报告的异常ClassNotFoundException;必须被捕获或声明为抛出
- 25. 未报告的异常java.io.FileNotFoundException;必须被捕或宣布被抛出6
- 26. 未报告的异常java.io FileNotFoundException;必须捕获或声明抛出
- 27. java:未引发异常java.io.FileNotFoundException;必须被捕获或被宣告为抛出
- 28. StructureMap认为它必须注入构造函数并抛出异常
- 29. 如何处理“异常;必须被捕获或声明被抛出”?
- 30. 未报告异常ClassNotFoundException的;必须捕获或抛出的Class.forName(在sun.jdbc.odbc.JdbcOdbcDriver)
将其分解为三个问题。 (1)抛出后的方法中的任何代码是否会被执行?是。如果异常是在try中,那么匹配catch块或finally块中的代码将被执行。如果没有尝试块,则没有。控制最后分支到最近的包围,捕获或(在vb中)异常过滤块阻止堆栈。 – 2009-06-13 15:11:59
(2)投掷后我必须休息吗?不,不要那样做。 throw语句的结束点不可访问;一个throw被编译器视为goto。紧跟在一个throw之后的语句不可达,并且永远不会执行。 – 2009-06-13 15:13:02
(3)抛出是否总是退出该方法?没有。如果投掷是在尝试中,并且尝试有一个匹配的catch块,那么catch块可以“吃”这个异常。只有在没有catch块的情况下,异常才会执行非本地的调用堆栈。 – 2009-06-13 15:13:58