[C#] 学会处理异常

学会处理异常

  C# 程序员可使用 try 块对可能受异常影响的代码进行分区。 关联的 catch 块用于处理任何结果异常。 一个包含代码的 finally 块,无论 try 块中是否引发异常(例如,释放在 try 块中分配的资源),这些代码都会运行。 一个 try 块需要一个或多个关联的 catch 块或一个 finally 块,或两者。

  这里分别给出了一个 try-catch 语句,一个 try-finally 语句,和一个 try-catch-finally 语句。

  try-catch:

 1         static void Main(string[] args)
 2         {
 3             try
 4             {
 5                 //需要执行的代码
 6             }
 7             catch (Exception e)
 8             {
 9                 //这里可以获取到被捕获的异常
10                 //你需要知道自己应该如何处理该异常
11             }
12         }

  try-finally:

1             try
2             {
3                 //需要执行的代码
4             }
5             finally
6             {
7                 //在 try 块后执行的代码
8             }

  try-catch-finally:

 1             try
 2             {
 3                 //需要执行的代码
 4             }
 5             catch (Exception e)
 6             {
 7                 //这里处理异常
 8             }
 9             finally
10             {
11                 //在 try 块(也可能是 catch 块)后执行的代码
12             }

  【备注】不带有 catch 或 finally 块的 try 块将导致编译器错误。

捕获异常的 Catch 块

  catch 块可以指定要捕捉的异常的该类型。 类型规范称为“异常筛选器”。 异常类型应从 Exception 派生出来。 一般而言,不会将 Exception 指定为异常筛选器,除非您了解如何处理 try 块中可能引发的所有异常,或者您在 catch 块中包括了 throw 语句。

  具有不同异常筛选器的多个 catch 块可以串联在一起。 多个 catch 数据块的计算顺序是在代码中从顶部到底部,但是,对于所引发的每个异常,都只执行一个 catch 数据块。 与指定的准确类型或其基类最为匹配的第一个 catch 块被执行。 如果 catch 块没有指定匹配异常筛选器,则 catch 块就不具有选定的筛选器(如果语句有的话)。 需要将带有最具体的(即派生程度最高的)异常类的 catch 块放在最前面。

  当下列条件为真时,应该捕捉异常:

  • 对引发异常的原因有具体的了解,并可实现特定的恢复,例如,在捕获 FileNotFoundException 对象时提示用户输入新的文件名。
  • 可以新建一个更具体的异常并引发该异常。
 1         double GetNum(double[] nums,int index)
 2         {
 3             try
 4             {
 5                 return nums[index];
 6             }
 7             catch (IndexOutOfRangeException e)
 8             {
 9                 throw new ArgumentOutOfRangeException("Sorry, 你想要的索引已经超出界限!");
10             }
11         }

  希望在将异常传递出去进行时,我们通常会处理部分异常。 在下面的示例中,catch 块用于在再次引发异常之前,添加错误日志,这是我们常用的做法。

 1             try
 2             {
 3                 //尝试访问系统资源
 4             }
 5             catch (Exception e)
 6             {
 7                 //伪代码:记录错误日志
 8                 log.Error(e);
 9
10                 //再重新抛出错误
11                 throw;
12             }

释放资源的 Finally 块

  可以使用 finally 块清理在 try 块中执行的操作。 如果存在,finally 块将在最后执行,在 try 块和任何匹配 catch 的块之后执行。 不管是否引发异常或者是否找到与异常类型匹配的 catch 块,finally 始终运行。

  可以使用 finally 块释放资源(如文件流、数据库连接和图形句柄),而不用等待由运行时中的垃圾回收器来完成对象。 其实,我们更建议使用 using 语句。

  在下面的示例中,使用 finally 块关闭在 try 块中打开的文件。注意,在关闭文件之前要检查该文件句柄的状态。 如果 try 块无法打开文件,则文件句柄仍具有值 null,并且 finally 块不会尝试关闭它。 或者,如果在 try 块中成功打开该文件,则 finally 块将关闭打开的文件。

 1         static void Main(string[] args)
 2         {
 3             FileStream fs = null;
 4             FileInfo fi = new System.IO.FileInfo("C:\\小二和小三的故事.txt");
 5
 6             try
 7             {
 8                 fs = fi.OpenWrite();
 9                 fs.WriteByte(0);
10             }
11             finally
12             {
13                 // 记得判断 null 哦,不然可能触发其它异常
14                 if (fs != null)
15                 {
16                     fs.Close();
17                 }
18             }
19
20         }


【博主】反骨仔

【原文】http://www.cnblogs.com/liqingwen/p/6193999.html

【参考】微软官方文档

时间: 2024-10-11 11:54:47

[C#] 学会处理异常的相关文章

[C#] 学会使用异常(整理中)

学会使用异常 在 C# 中,程序中的运行时错误通过使用一种称为“异常”的机制在程序中传播. 异常由错误的代码引发,并由能够更正错误的代码进行捕捉. 异常可由 .NET 的公共语言运行时 (CLR) 或由程序中的代码引发. 一旦引发了一个异常,这个异常就会在调用堆栈中向上传播,直到找到针对它的 catch 语句.未捕获的异常由系统提供的通用异常处理程序处理,也就是你经常看到的一个对话框. 异常由从 Exception 派生的类进行表示.此类标识异常的类型,并包含详细描述异常的属性.这里演示自定义一

java利用poi读取excel异常问题

最近一个web工程需要完成一个小功能,利用文件上传然后读取文件内容写入到数据库,这里是操作的excel文件,excel文件分两种后缀,03版本的xls和之后的xlsx,现在大家一般都拿非常好用的插件直接过来用就可以了,我这里用的是java poi相关资源包. 1,首先要能够读取带xlsx的excel文件,必须要导入如下的jar包 然后遇到的问题是在本地工程下建立的一个测试类测试没有异常,两种excel的文件都能读取,但是一旦发布到web工程下,我的工程是在tomcat下跑的.这里就出现了问题,总

Springmvc处理异常

文章目录 关于异常 异常的体系结构: 1 2 3 4 5 6 7 8 9 10 11 12 13 Throwable Error OutOfMemoryError(OOM) Exception RuntimeException NullPointerException:某个为null的对象调用了属性或方法 ClassCastException:强制转换为不匹配的数据类型 ClassNotFoundException:尝试加载的类不存在 IndexOutOfBoundsException:使用Li

JAVA基础知识点总结(全集)

1.JAVA简介 1.1java体系结构:j2se,javaweb,j2ee 1.2java特点:平台无关(虚拟机),垃圾回收(使得java更加稳定) 1.3 JDK与JRE,JDK:java开发环境,JRE:java运行环境 1.4第一个java程序:HelloWorld,java的入口是main(public static void main(String[] args)) 1.5java程序的开发步骤:.java编译(javac)成.class运行(java).class文件 2.基本数据

任务一 学习C#以及开始使用VS

学习.net的第一步肯定是要学习C#的,其实C#有很多是C++本来就有的思想,所以理解起来并不困难,重点的只是一些语法以及习惯. 关于C#, 我建议不要急着啃书,因为书籍确实太过于无聊,多去网上搜索视频看看,这些视频有些经过了作者的提炼讲的东西基本都 是重点,对于学习很有帮助,当然也需要买一本C#的专业书籍随时放在桌面上,没事看一看,遇到问题再去仔细看那一章节,而不是 一味的从开头啃到结尾,当然你有这样的毅力是最好的. 当然学习过程中也有我觉得困难的地方,比如说: 1.异常的处理,C#的学习中,

python自学路线

一.Python学习路线图—流程篇: Python 学习路线图 Python 各阶段获得技能说明 二.Python学习路线图—视频篇: 1.第一阶段-Python基础知识 视频篇–第一阶段.Python基础 本阶段Python基础课程课程共计9个知识点,2个免费视频涵盖 1.学习目标: 能够熟练使用Python技术完成针对小问题的程序编写以及小游戏程序的开发. 2.知识点: 1)计算机组成原理 计算机组成部分.操作系统分类.B/S和C/S架构.理解软件与硬件的区别 2)Python变量以及开发环

锤死虚假流量,还得从数据统计开始!

前段时间,一篇控诉微博大V虚假流量的公众号文章,刷爆了互联网人的朋友圈,在文中,作者说她选择了微博领域流量的头部机构进行广告投放,这个机构手持多个微博大号,一条微博投放的价格就有几十万,当事人提出先选择一个拥有380万粉丝博主,发布内含广告内容的原创VLOG视频,测试一下看看效果怎么样.而满怀等待的看着微博发出后,但是却惊诧愤怒地发现,视频的浏览量为353万,但是他们店铺的流量和成交数几乎为0! 沟通过后,对方推诿,于是就写文开骂,作者文中最后说因为合同问题,告不了对方,但是也要曝光出上一口气.

21天学会C#----如何处理异常

通过try,catch来捕获异常信息,并且可以通过过个catch(exception)(indexOutOfRangeException),使用catch以后finally仍将被执行 IO名称空间包含了用于发送和接受(输入和输出)信息的例程 checked & unchecked:检测最大值和最小值 关键字is,as.is:用于确定变量是否为指定的类型(expression is type)expression是引用类型,type是有效类型.可在if条件判断语句中: as:跟强制转换符类似,将对

异常相关问题

1.Java中的两种异常是什么?它们之间的区别? Java有两种类型的异常:checked与unchecked(检查与未检查) 异常. 如果unchecked异常可能会在方法或构造函数的执行时被抛出从而蔓延到方法或构造函数的外部, 它们也不需要要在方法或构造函数中声明throws子句. 然而, checked异常必须通过方法或构造函数的throws子句声明. 关于java异常处理的建议请参考这里Java exception handling. 2.Java中异常与错误的区别? Exception