.Net/C# -- 异常(一)

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通常尽力去执行它,它通常用来做一些清理任务,

如下一段程序:

.Net/C# -- 异常(一)

这个时候报错程序就终止了,而如果加入try语句和catch语句,程序依旧可以执行完!代码如下:

.Net/C# -- 异常(一)

当异常被抛出的时候:ClR会执行一个测试,当前是否执行在能够catch异常的try语句里

如果是:当前执行,就会传递给兼容的catch块里面,如果catch块完成了执行,那么执行会移动到try语句后面的语句,如果有finally块存在,会先执行finally块

如果不是:执行会返回到函数的调用者并重复这个测试过程(在执行完任何包裹这语句的finally块之后)

再来仔细聊一聊catch语句:

catch子句指定要捕获的异常的类型。这个异常必须是system.Exception或其子类

捕获System.Exception这个异常的话就会捕获所有可能的错误,当处理下面几种情况时,这么做是有用的:

1:无论是哪种类型的异常,你的程序都可能从错误中恢复

2:你计划重新抛出异常(可能是在你记录log之后)

3:你的错误处理器是程序终止运行前的最后一招

但是在实践中,更典型的情况时:我们要catch特定情况类型的异常(比如上边的例子,使用的是DivideByZeroException),特定情况特定处理,为的是避免处理那些你的处理程序并未针对设计的情况

你可以,使用多个catch子句来处理多个异常类型。如下:

.Net/C# -- 异常(一)

上列中,针对给定的异常,只有一个catch子句会被执行,也就是只能看抛出一种具体类型的异常。

如果你希望一个兜底的catch可以捕获任何类型的异常,那么你需要把特定类型的异常捕获放在靠前的位置。

如果你不需要访问异常的属性,那么你可以不指定异常变量,如下:

.Net/C# -- 异常(一)

更甚者,你可以把异常类型和变量都拿掉,这也意味着它会捕获所有异常。如下:

.Net/C# -- 异常(一)

异常的过滤

从C#6开始,你可以在catch子句中添加一个when子句来指定一个异常过滤器,如下:

.Net/C# -- 异常(一)

 此例中,如果WebException被抛出的话,那么when后边的bool表达式就会被执行估算,如果计算的结果为false,那么后边的所有的catch子句都会在考虑范围内。如下:

.Net/C# -- 异常(一)

最后,学一下finally块

finally块基本上永远都会被执行,无论是否抛出异常,无论try块是否跑完,finally块通常用来写清理代码。

finally块会在一下情况被执行:

1:在一个catch块执行完毕

2:因为跳转语句(例如:return),程序的执行离开了try块

3:try块执行完毕后

唯一可以不让finally块执行的东西就是无限循环,或者程序突然结束。如图:

.Net/C# -- 异常(一)

 

 

 结果就是:

.Net/C# -- 异常(一)

using语句

• 很多类都封装了非托管的资源,例如文件处理、图像处理、数据库连接等。

• 这些类都实现了IDisposable 接口,这个接口定义了一个无参的 Dispose 方法用来清理这些资源。

• using 语句提供了一个优雅的语法来在finally块里调用实现了IDisposable 接口对象上的 Dispose 方法。

 

.Net/C# -- 异常(一)

上一篇:c# 语法糖 yield


下一篇:2020提高组模拟赛7 StormWind