什么是异常?
异常是程序中的运行时错误,它违反了系统约束或应用程序约束,或是正常操作时不会发生的状况。比如用一个数除以0:
int a=1,b=0;
a/=b;
//程序将会终止,并提示一个未处理的异常:不能用0当除数。
什么是异常处理?
在发生异常时,如果无法采取纠正措施,那么你的应用程序就应该被终止,因为在不稳定或未知的情况下继续运行程序,很有可能出现令人难以解决的bug。
为了在程序发生异常时能够让程序继续运行下去,我们需要进行异常处理,通常的做法是:尽可能的采取纠正措施、记录有关异常的信息、清理任何外部资、向用户发送友好信息等。
try语句
try语句用来指明为避免出现异常而被保护的代码段,并在异常发生时提供代码来处理。try语句由三个部分组成:
try块
try块包含为避免出现异常而被保护的代码。在编写代码时,将可能会出现异常的代码放入到try块当中。比如用一个数除以0时会发生异常,可将处理代码放入到try块当中。
int a=1,b=0;
a/=b;
catch子句部分
catch子句部分包含一个或多个catch子句,是处理异常的代码,也称为异常处理程序。当try块中发生异常时,catch子句捕获异常,不同形式的catch子句处理不同的异常。先来讲讲异常类的类型和catch子句的多种形式。
异常类
程序运行时,可能会发生不同类型的异常,为此,BCL定义了多种异常类,每一个类代表一种指定的异常类型,当一个异常发生时,CLR创建该类型的异常对象,并找到合适的catch子句处理它。所有异常类都派生自System.Exception类,而System.Exception类派生自System.Object类。
异常对象带有只读属性,其中常用的部分属性如下:
- Message,返回类型是string,解释异常原因的错误信息。
- StackTrace,返回类型是string,描述异常发生在何处的信息。
- InnerException,返回类型Exception,如果当前异常是由另外一个异常引起的,则这个异常包含前一个异常的引用。
- Source,返回类型是string,如果没有被应用程序定义的异常设定,那么这个属性含有异常所在的程序集的名称。
catch子句的四种形式
catch { Statements }
一般catch子句:在catch关键字后没有参数列表;匹配try块中抛出的任何异常。catch ( ExceptionType ) { Statements }
特定catch子句:以一个异常类的名称作为单一参数,匹配任何指定类型的异常。catch ( ExceptionType ExceptionVariable ) { Statements }
带对象的特定catch子句:在异常名称之后包括一个标识符,该标识符在catch子句块中相当于一个局部变量,并称为异常变量,异常变量引用异常对象,并能用于访问该对象的信息。catch ( ExceptionType ExceptionVariable ) when ( predicate ) { Statements }
带谓词的特定catch子句:在异常名称之后包含一个标识符;该标识符在catch子句中相当于一个局部变量,并称为异常变量;异常变量引用异常对象,并能用于访问关于该对象的信息;只有当谓词计算结果为true时,才能进入字句块,而且,谓词表达式中的任何异常都会被忽略,但表达式不能是异步的。
catch可以同时存在多个,但只执行第一个匹配成功的子句。
finally块
finally块包含无论异常是否发生都要执行的代码,即使try块中有return语句或在catch中抛出一个异常,finally块也总是在返回到调用代码之前执行,也就是说,进入了try语句,则try语句中的finally块都将被执行。