.Net/C# -- 异常(一)
2020-12-23 23:28
标签:表达式 范围 封装 子类 计划 deb 语法 设计 一段 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 方法。 .Net/C# -- 异常(一) 标签:表达式 范围 封装 子类 计划 deb 语法 设计 一段 原文地址:https://www.cnblogs.com/dcy521/p/13501574.html