异常处理

.net对异常的处理流程:当异常发生时,它顺着调用路径展开栈,一层层的向上寻找异常处理代码,如果有某一层有异常处理代码,则程序流程从异常处理代码处重新开始执行,如果都没有异常处理代码,则异常将交由CLR处理

 

C# Primer P268处的代码很好的说明了.net异常处理的过程

 

 

抛出异常:throw语句用于主动抛出异常,它有以下几种调用形式

 

异常对象:Message(只读)、HelpLink、InnerException是异常对象的常用属性,也可以根据需要自定义异常类,以下是一段自定义异常类的代码示例

 

异常处理语法:以下是异常处理语法的三种形式

在使用finally时要注意,在编译环境中,没有catch的finally块中的代码默认不被执行,编译器优先捕获异常并提示,要查看finally的使用效果,需要将程序编译成exe,debug或release都可.

 

此外变量的作用域将限于try块,无法在catch块和finally块中引用,最好在try块之前声明变量,在try块中实例化

 

catch有以下几种使用形式

catch{}被称为一般catch块,它与catch(Exception)是不太一样的,通常一般catch块处理的是其他没有用C#编写的代码(甚至根本不是托管代码)抛出的异常。在C#语言中,只有派生于System.Exception的类的实例,才能作为异常来抛出。但其他语言没有这个限制,例如C++允许把变量作为异常来抛出。如果代码调用了其他语言编写的库或程序集,抛出的异常就可能不是派生于System.Exception。但在许多情况下,.NET PInvoke机制会捕获这些异常,把它们转换为.NET Exception对象

 

在一个try块中可以有多个catch语言,如

异常按从上至下的顺序优先匹配

 

finally 无论异常是否抛出都要执行,通常用于释放资源,先看以下一段代码

输出exe文件并执行,会看到异常发生后,finally代码块会被执行,然后是.net的异常提示,而MessageBox.Show("End")没有被执行,正像finally的语法说明那样,无论异常与否,它总是被执行

 

通常finally是与catch配合使用的,try{}catch{}finally{},try中处理危险资源,catch里捕获异常,而finally中释放资源。在以下代码中,段一和段二运行起来并没有什么区别,但如果在catch中再抛出一个异常或有一条return语句,则代码段一和段二就有了显著的区别,finally总是会在栈展开或返回之前执行

这也与finally的语法说明相符-finally总是被执行

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值