孙鲸鹏 南京技师学院
在日常生活中我们不可避免的会遇到各种意想不到的事情,同样开发人员编写的应用程序代码在运行过程中,也会发生各种难以预料的问题。当代码不能对遇到的问题进行处理时,就会发生“异常(EXCEPTION)”,随之而来的是程序发生报错、数据丢失甚至于系统崩溃等问题。如果缺乏对这些异常的处理可能会给用户带来巨大的损失,如何对这些不可预知的异常的进行处理也成了开发人员的必备技能。本文以C#开发环境中的异常处理为例展开阐述与分析。
C#(C SHARP)是一款基于微软.NET Framework框架的面向对象高级编程语言。C#语言继承并发扬了VB语言的所见即所得的便利操作性和C++语言的高效率的特性,语法优美规范、是.NET平台开发的首选。尽管基于C#开发环境中的应用程序稳定性在不断提高,但是由于客户的使用环境与习惯千变万化使得应用程序的异常时有发生。C# 语言的异常处理功能可帮助开发人员处理应用程序运行时出现的任何意外或异常情况。异常处理利用try、catch和finally编写相关代码来实现某些逻辑,以处理异常情况。其次是在事后释放资源时,使用异常处理也有很大的帮助。
try块包含的代码通常需要执行一些通用的资源释放操作,或者需要从异常中恢复,或者两者都需要。释放代码应放在一个finally块中。try块还可包含也许会抛出异常的代码。异常恢复代码应放在一个或多个catch块中。针对应用程序能从中安全恢复的每一种异常,都应该创建一个catch块。一个try块至少要有一个关联的catch块或finally块,单独一个try块是没有意义的,也是不合法的。
catch块内的代码用以响应异常并执行相关的代码。单个try块可以关联多个catch块,也可以不关联任何catch块。如果try块中的代码执行过程中未遇到异常,那么CLR将不会执行它的任何catch块中的代码。线程将跳过所有catch块,直接执行finally块中的代码。finally块中的代码执行完毕后,执行从finally块后面的语句继续。
catch关键字后的圆括号中的表达式称为捕捉类型。在C#中,必须将捕捉类型指定为System.Exception或者是其派生类型。
多数情况下,异常并不是由代码的执行报错抛出,而是由调用堆栈中底层的其它方法所引发。在这种情况下,将由CLR将负责查找堆栈内是否由对应此异常类型的catch块,如果存在,则执行该catch块内代码。如果不存在对应的catch块,则终止该进程,并将此消息提示给用户。
finally块包含的代码是保证会执行的代码。通常为执行的try块中的操作所要求的资源释放。finally 块将在最后执行,在 try 块和任何匹配 catch 的块之后执行。 不管是否引发异常或者是否找到与异常类型匹配的 catch 块,finally 始终运行。
finally 块内代码多用于资源的释放,而不用等待由CLR中的GC来完成对象的回收工作。
异常处理在软件开发中的使用非常广泛,其过程可以归结为在异常发生前做好分类定义,发生后保护现场,处理异常,退出异常处理程序后,恢复被中断程序的运行。
C# 开发人员可使用 try 块对可能受异常影响的代码进行分区。 关联的 catch 块用于处理任何结果异常。 一个包含代码的finally 块,无论 try 块中是否引发异常(例如,释放在 try 块中分配的资源),这些代码都会运行。 一个 try 块需要一个或多个关联的 catch 块或一个 finally 块,或两者。C# 语言的异常处理功能中的try-catch、try-finally和 try-catch-finally 三个语句可以灵活运用,使用非常方便。
对于所有已知错误引发的异常,开发人员可以通过采取一些措施允许应用程序从异常中恢复并继续运行。示例代码如下:
上述代码计算两个数相除的值,并将这个值通过字符串返回给调用函数,若发生异常则由catch段代码对result进行赋值,给用户合理的提示。如果除数b为0,那么CLR将抛出DivideByZeroExcep
tion异常,并向用户返回“除数不能为零!”这个结果。如果被除数a为最大整数,而除数为最小实数,那么结果超出取值范围CLR将抛出
OverflowException异常,并向用户返回“数据溢出,无法显示数据!”这个结果。这种做法极大的提升了用户的体验性,同时也对开发人员对各种异常捕捉恢复提出了较高的要求。
总结:任何技术高明的程序员所编写的应用程序都不可能绝对不出差错的运行,如何使用异常处理来提高应用程序的友好性、容错性及准确的错误信息收集能力是优秀的应用程序必须具备的特点。本文在分析了异常处理技术的概念和思想后,对异常处理进行了总结,并针对C#语言给出了相关示例,探讨了对应的解决措施,希望能对读者在开发应用程序时有所帮助。