

对程序员来说,异常—— 即运行期发生的错误——是一个不可避免的现象。好的程序开发方法能够最小化异常现象的发生,但要完全防止异常的发生是不可能的。有很多原因会造成异常现象,如网络错误或不正确地设置文件权限,这些都超出了程序开发人员的控制范围。这篇摘自Informit的文章介绍了如何过滤Catch语句来处理异常。
在这篇文章中使用的是visual Basic,但此原理和技术同样可以应用于C#中。
.NET framework执行结构化的异常处理方法。结构化的意思是指代码将可能造成异常现象。另外,用于处理异常现象的代码被组织在结构化的块中。你可以使用Try…Catch…End的Try语句来达到这个目的。
在.NET的结构化异常处理过程中必须要有过滤Catch语句的能力。如果没有进行过滤 – 更精确些说是过滤所有的异常 – 则在执行Catch块中的代码时将会处理所有被弹出来的异常。这种Catch块的写法如下:
Catch ex As Exception
在上面的Catch块中,对象ex是系统的一个实例,Exception类包含异常信息。尽管传统的用法是使用ex或e,你也可以使用其他合法的变量名。要过滤特殊的异常,Catch语句将写成这样:
Catch ex As ExceptionType
将ExceptionType替换成所捕捉到的某个特殊的异常名。.NET framework为许多异常类定义了一个层次级别,这些异常类都来源于系统。每个异常类中都包含着一些相关的异常。例如,所有的与文件相关的异常都属于IoException类,但想要得到更详细的控制信息,你就需要使用FileLoadException和FileNotFoundException类来捕获文件装载异常。在Visual Studio文档中含有完整的异常层次等级图。
这种过滤能力可以让你的Catch语句块来处理特殊的异常。这种处理特殊异常的过滤能力是很有意义的。不同的异常类型,会使得用户得到的消息和程序的响应也不一样。为每一种情况创建一个Catch语句块,最后一个Catch语句块是当前面的Catch块都不匹配时才执行。下面是这个例子的代码:
Catch ex As FileNotFoundException
' Code here to respond to a "File Not Found" exception.
Catch ex As FileLoadException
' Code here to respond to a "File Load" exception.
Catch ex As Exception
' Code here to respond to any exceptions not caught by previous Catch statements.
在Catch ex As Exception语句中,Catch关键字将捕获任何的异常。但不足的地方是,在那个块中不含有任何关于异常和造成异常原因的Exception对象。