Try语句
1:try 语句指定了用来进行错误处理或清理的一个代码块。
2:try 语句块后边必须紧接着一个 catch 块或者是一个 finally 块,或者两者都有。
3:当 try 块里发生错逞的时候, catch 块就会被执行。
4:finally 块会在执行完 try 块之后执行,如果 catch 也执行了,那就在 catch 块后边执行。finally 块用来执行一些清理代码,无论是否有错误发生。
catch语句
1:Catch块可以访问一个 Exception对象,这个 Exception对象里含有关于错误的信息。
2:Catch 块通常被用来对错误进行处理/补偿或者重新抛出异常。 finally
finally
1:为你的程序增加了确定性,CLR通常尽力去执行它,它通常用来做一些清理任务,
如下一段程序:
这个时候报错程序就终止了,而如果加入try语句和catch语句,程序依旧可以执行完!代码如下:
当异常被抛出的时候:ClR会执行一个测试,当前是否执行在能够catch异常的try语句里
如果是:当前执行,就会传递给兼容的catch块里面,如果catch块完成了执行,那么执行会移动到try语句后面的语句,如果有finally块存在,会先执行finally块
如果不是:执行会返回到函数的调用者并重复这个测试过程(在执行完任何包裹这语句的finally块之后)
再来仔细聊一聊catch语句:
catch子句指定要捕获的异常的类型。这个异常必须是system.Exception或其子类
捕获System.Exception这个异常的话就会捕获所有可能的错误,当处理下面几种情况时,这么做是有用的:
1:无论是哪种类型的异常,你的程序都可能从错误中恢复
2:你计划重新抛出异常(可能是在你记录log之后)
3:你的错误处理器是程序终止运行前的最后一招
但是在实践中,更典型的情况时:我们要catch特定情况类型的异常(比如上边的例子,使用的是DivideByZeroException),特定情况特定处理,为的是避免处理那些你的处理程序并未针对设计的情况
你可以,使用多个catch子句来处理多个异常类型。如下:
上列中,针对给定的异常,只有一个catch子句会被执行,也就是只能看抛出一种具体类型的异常。
如果你希望一个兜底的catch可以捕获任何类型的异常,那么你需要把特定类型的异常捕获放在靠前的位置。
如果你不需要访问异常的属性,那么你可以不指定异常变量,如下:
更甚者,你可以把异常类型和变量都拿掉,这也意味着它会捕获所有异常。如下:
异常的过滤
从C#6开始,你可以在catch子句中添加一个when子句来指定一个异常过滤器,如下:
此例中,如果WebException被抛出的话,那么when后边的bool表达式就会被执行估算,如果计算的结果为false,那么后边的所有的catch子句都会在考虑范围内。如下:
最后,学一下finally块
finally块基本上永远都会被执行,无论是否抛出异常,无论try块是否跑完,finally块通常用来写清理代码。
finally块会在一下情况被执行:
1:在一个catch块执行完毕
2:因为跳转语句(例如:return),程序的执行离开了try块
3:try块执行完毕后
唯一可以不让finally块执行的东西就是无限循环,或者程序突然结束。如图:
结果就是:
using语句
• 很多类都封装了非托管的资源,例如文件处理、图像处理、数据库连接等。
• 这些类都实现了IDisposable 接口,这个接口定义了一个无参的 Dispose 方法用来清理这些资源。
• using 语句提供了一个优雅的语法来在finally块里调用实现了IDisposable 接口对象上的 Dispose 方法。