[C#] C# 知识回顾 - 学会处理异常
学会处理异常
你可以使用 try 块来对你觉得可能会出现异常的代码进行分区。 其中,与之关联的 catch 块可用于处理任何异常情况。 一个包含代码的 finally 块,无论 try
块中是否在运行时引发异常(例如,释放在 try
块中分配的资源),这些 finally 块的代码都会运行。 这些“异常部分”:可以由一个 try
块、一个或多个关联的 catch
块、一个 finally
块分别组合。
这里我列举了 3 种情况:一个 try-catch
语句,一个 try-finally
语句,和一个 try-catch-finally
语句。
try-catch:
- static void Main(string[] args)
- {
- try
- {
- //需要执行的代码
- }
- catch (Exception e)
- {
- //这里可以获取到被捕获的异常
- //你需要知道自己应该如何处理该异常
- }
- }
try-finally:
- try
- {
- //需要执行的代码
- }
- finally
- {
- //在 try 块后执行的代码
- }
try-catch-finally:
- try
- {
- //需要执行的代码
- }
- catch (Exception e)
- {
- //这里处理异常
- }
- finally
- {
- //在 try 块(也可能是 catch 块)后执行的代码
- }
【备注】不带有 catch
或 finally
块的 try
块将导致编译器错误。
捕获异常的 Catch 块
catch
块可以指定要捕捉的异常类型,又可以称为“异常筛选器”。 异常类型都是从 Exception 派生出来。 一般来说,我们不会将所有异常的基类 System.Exception 指定为要 catch 的“异常筛选器”,除非你非常了解如何处理由 try
块引发的所有异常,或者在 catch
块中包括了 throw 语句。
多个 catch
块可以串联在一起(要求异常筛选器不同)。 多个 catch
块的执行顺序是:在代码中,从顶部到底部,但是,对于在运行时所引发的每一个异常,程序都只会执行一个 catch
数据块。 与指定的异常类型或它的基类相匹配的第一个 catch
块,才会被执行。 通常,我们需要将最特殊(最具体或者说派生程度最最最高)的异常类,这段 catch
块放在所有 catch 块的最前面,而他们的基类 Excetion 的 catch 块就放在最后(当然,也可以不写)。
在以下条件为真时,你应该选择 catch 异常:
了解引发异常的原因,并可实现有选择性的恢复。例如,在捕获 FileNotFoundException 时你可以提示用户“文件找不到”和“请输入新的文件名”等。
你也可以新建一个更具体或者说更具有代表性的异常,并选择引发该异常。
- double GetNum(double[] nums,int index)
- {
- try
- {
- return nums[index];
- }
- catch (IndexOutOfRangeException e)
- {
- throw new ArgumentOutOfRangeException("Sorry, 你想要的索引已经超出界限!");
- }
- }
希望在将异常抛出去时,我们通常会选择处理部分异常。 在下面这个示例中,catch
块在再次 throw 异常之前,添加错误日志。
- try
- {
- //尝试访问系统资源
- }
- catch (Exception e)
- {
- //伪代码:记录错误日志
- log.Error(e);
- //再重新抛出错误
- throw;
- }
释放资源的 Finally 块
可以使用 finally
块释放(清理)在 try
块中需要执行释放(清理)资源的操作。 如果存在finally
块,它将在最后执行,也就是在 try
块和任何匹配 catch
块之后执行。 不管是否引发异常或者说是否找到与异常类型相匹配的 catch
块,finally
块它始终都会运行。
可以使用 finally
块释放资源(如 IO 流、DB 连接和图形句柄),而不要等待运行时中的垃圾回收器来完成对象资源的回收。 其实,我们更建议使用 using 语句。
在下面的示例中,我使用 finally
块关闭在 try
块中打开的文件。注意,在关闭文件之前你应该要检查该文件句柄的状态。 如果 try
块无法打开文件,则文件句柄的值依然为 null
,这时, finally
块就不会尝试关闭它。 或者说,如果在 try
块中成功打开该文件,则 finally
块才会成功地关闭正在打开的文件。
- static void Main(string[] args)
- {
- FileStream fs = null;
- FileInfo fi = new System.IO.FileInfo("C:\\小二和小三的故事.txt");
- try
- {
- fs = fi.OpenWrite();
- fs.WriteByte();
- }
- finally
- {
- // 记得判断 null 哦,不然可能触发其它异常
- if (fs != null)
- {
- fs.Close();
- }
- }
- }
C# 基础回顾系列
《C# 知识回顾 - 委托 delegate》、《C# 知识回顾 - 委托 delegate (续)》
《C# 知识回顾 - 事件入门》、《C# 知识回顾 - Event 事件》
《string 与 String,大 S 与小 S 之间没有什么不可言说的秘密》
《C# 知识回顾 - 异常介绍》、《C# 知识回顾 - 学会使用异常》
【博主】反骨仔
【原文】http://www.cnblogs.com/liqingwen/p/6193999.html
【参考】微软官方文档
[C#] C# 知识回顾 - 学会处理异常的更多相关文章
- [C#] C# 知识回顾 - 学会使用异常
学会使用异常 在 C# 中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”. 异常通常由错误的代码引发,并由能够更正错误的代码进行 catch. 异常可由 .NET 的 CLR ...
- [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?
你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...
- [C#] C# 知识回顾 - 异常介绍
异常介绍 我们平时在写程序时,无意中(或技术不够),而导致程序运行时出现意外(或异常),对于这个问题, C# 有专门的异常处理程序. 异常处理所涉及到的关键字有 try.catch 和 finally ...
- [C#] C# 知识回顾 - 序列化
C# 知识回顾 - 序列化 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902005.html 目录 序列化的含义 通过序列化保存对象数据 众 ...
- java基础知识回顾之---java String final类普通方法
辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /* * 按照面向对象的思想对字符串进行功能分类. * ...
- C# 知识回顾 - 装箱与拆箱
装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 生活中的装箱与拆箱 我们习惯了在网上购物,这次你想买本编程书 -- <C 语言从入门到放弃> ...
- Java基础知识回顾之七 ----- 总结篇
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
- [C#] C# 知识回顾 - 装箱与拆箱
装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 读者见解 生活中的装箱与拆箱 我们习惯了在网上购物,这次你想买本编程书 -- <C 语言从入门到放弃 ...
- [C#] C# 知识回顾 - Lambda
C# 知识回顾 - Lambda 序 它是第十一个希腊字母,一个拥有失意.无奈.孤独.低调等含义的流行符号,也指示一款称为“半条命”的游戏. 不过,这次我所讲的是 C# 中的 Lambda. 目录 L ...
随机推荐
- JavaWeb——Filter
一.基本概念 之前我们用一篇博文介绍了Servlet相关的知识,有了那篇博文的知识积淀,今天我们学习Filter将会非常轻松,因为Filter有很多地方和Servlet类似,下面在讲Filter的时候 ...
- C语言 · 数位分离
问题描述 编写一个程序,输入一个1000 以内的正整数,然后把这个整数的每一位数字都分离出来,并逐一地显示. 输入格式:输入只有一行,即一个1000以内的正整数. 输出格式:输出只有一行,即该整数的每 ...
- C#基础篇 - 正则表达式入门
1.基本概念 正则表达式(Regular Expression)就是用事先定义好的一些特定字符(元字符)或普通字符.及这些字符的组合,组成一个“规则字符串”,这个“规则字符串”用来判断我们给定的字符串 ...
- jQuery学习之路(8)- 表单验证插件-Validation
▓▓▓▓▓▓ 大致介绍 jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方法,包括 ...
- Nginx如何处理一个请求
看了下nginx的官方文档,其中nginx如何处理一个请求讲解的很好,现在贴出来分享下.Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听 ...
- 如何利用pt-online-schema-change进行MySQL表的主键变更
业务运行一段时间,发现原来的主键设置并不合理,这个时候,想变更主键.这种需求在实际生产中还是蛮多的. 下面,看看pt-online-schema-change解决这类问题的处理方式. 首先,创建一张测 ...
- MySQL主从环境下存储过程,函数,触发器,事件的复制情况
下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...
- 阿里云服务器上配置并使用: PHP + Redis + Mysql 从配置到使用
(原创出处为本博客,http://www.cnblogs.com/linguanh/) 目录: 一,下载 二,解压 三,配置与启动 四,测试 Redis 五,配置 phpRedis 扩展 六,综合测试 ...
- 【知识必备】ezSQL,最好用的数据库操作类,让php操作sql更简单~
最近用php做了点小东东,用上了ezSQL,感觉真的很ez,所以拿来跟大家分享一下~ ezSQL是一个非常好用的PHP数据库操作类.著名的开源博客WordPress的数据库操作就使用了ezSQL的My ...
- 【热门技术】EventBus 3.0,让事件订阅更简单,从此告别组件消息传递烦恼~
一.写在前面 还在为时间接收而烦恼吗?还在为各种组件间的消息传递烦恼吗?EventBus 3.0,专注于android的发布.订阅事件总线,让各组件间的消息传递更简单!完美替代Intent,Handl ...