C#中异常处理

try 块包含可能导致异常的保护代码。该块一直执行到引发异常或成功完成为止。

catch 子句使用时可以不带任何参数,这种情况下它捕获任何类型的异常,并被称为一般 catch 子句。它还可以接受从 System.Exception 派生的对象参数,这种情况下它处理特定的异常。

在同一个 try-catch 语句中可以使用一个以上的特定 catch 子句。这种情况下 catch 子句的顺序很重要,因为会按顺序检查 catch 子句。将先捕获特定程度较高的异常,而不是特定程度较小的异常。

catch finally 一起使用的常见方式是:在 try 块中获取并使用资源,在 catch 块中处理异常情况,并在 finally 块中释放资源。

finally语句与trycatch语句结合,形成trycatchfinally语句。finally语句同样以区块的方式存在,它被放在所有trycatch语句的最后面,程序执行完毕,最后都会跳到finally语句区块,执行其中的代码。无论程序是否产生异常,最后都会执行finally语句区块中的程序代码。

捕获异常时,catch块中尽量指定具体的异常筛选器,多个catch块应该保证异常由特殊到一般的排列顺序。指定具体的异常,可以节约CLR搜索异常的时间;而CLR是按照自上而下的顺序搜索异常,因此将特定程度较高的排在前面,而将特定程度较低的排在后面,否则将导致编译错误。也就是说存在多个catch时,try块中出现异常后,系统将从距离try块最近的catch块中查找相应的异常处理语句,如果匹配成功,就执行catch块中的异常处理语句,执行完之后,不再执行其他catch块中的异常处理语句,这个查找过程是从上到下的,主要是检查catch后面括号中的异常对象是否和系统捕获到的异常兼容。上面语句中有两个catch块,其中后面一个异常处理中Exception是所有异常类的基类,其能够兼容任何异常对象。如果把Exception放在try后面的第一个catch块中,则其后面的所有catch语句不能被执行,所以通常把具体的异常放在前面,把基类放在最后的catch块中。

基类可以捕获所有异常,我们可能会想:既然基类可以捕获所有异常,是不是只写一个Exceotion就可以解决问题了呢?在实际应用中,一般不会这样处理。打一比方,一所综合性医院有很多科室,每个科专门处理不同的病情,眼科医生擅长眼睛方面疾病,可以把Exception看做全科医生,名个派生的基类分别属于不同的专业科室,去医院看病总是选择最匹配的科室,为眼睛首先会选择眼科,而不会去找全科医生,虽然全科医生也是可以治眼病,但是毕竟不够专业。在异常处理中,也是首先选择各个专业的异常类,Exception放在最后。这需要特别注意:在一系列catch语句中,异常子类应该位于其父类之前。否则,不但会产生不能实现的代码,而且将发生编译错误。

 

C#提供了throw语句来引发异常。使用throw语句既可以引发系统异常,也可以引发自定义异常。使用throw语句抛出异常的语法如下:

throw ExObject;

ExObject:所要抛出的异常对象,这个异常对象是派生自System.Exception类的类对象。

如果抛出异常,程序将中断执行,跳转到捕获异常的catch语句块中,执行catch块中语句。如果没有抛出异常,就会继续执行下面的代码。如果使用throw抛出异常,没有相应的catch捕获异常,出现异常时会中断程序运行。使用throw语出抛出异常时,尽量不出抛出基类异常。因为基类异常对象包含的错误很多,无法判断是发生了什么类型的异常。

 

 

Try{}catch{}之后异常虽然被捕获但是还是存在的。

托管机制不一定会处理异常。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值