C++:异常处理-异常捕获

时间:2024-02-16 18:28:44

异常处理语法

如果函数内抛出一个异常(或在调用函数时抛出一个异常),则在异常抛出时系统会自动退出所在函数的执行。如不想再异常抛出时退出函数,可在函数内创建一个特殊块,用于测试各种错误。测试块作为普通作用域,可由关键字try引导,异常抛出后,可由catch引导的异常处理模块应能接收任何类型的异常。再try之后根据异常的不同情况,相应的处理方法由关键字catch引导,其格式为:

try{
	···//可能发生错误的代码
}catch(type1 t1){
	···//第一种类型异常处理
}catch(type t2){
	···//第二种类型异常处理
}
···//其他类型异常处理

异常处理部分必须直接放在测试块之后。每一个catch语句相当于以特殊类型为参数的函数。如果抛出的异常类型足以判断如何进行异常处理,则异常处理器catch中的参数可以省略。
try部分抛出的异常,系统将从前到后逐个与catch后所给出的异常类型相匹配。如果匹配成功,则进入相应的处理部分执行异常处理程序。
异常处理的执行流程如下:

  1. 程序进入try块,执行try块内的代码;
  2. 如果在try块内没有发生异常,则直接转到cacth块后的第一条语句执行下去;
  3. 如果发生异常,则根据throw抛出的异常对象类型来匹配一个catch语句(catch后的参数类型与throw抛出异常对象类型一致)。如果找到类型匹配的catch语句,则进行捕获,其参数被初始化为指向异常对象,执行相应catch内的语句模块;如果找不到匹配类型的catch语句,系统函数terminate会被调用,终止程序。

需要注意的是,通常在try块中,可能有已经分配但尚未释放的资源,如果可能,catch处理程序应该释放这些资源。

异常接口声明

C++提供了异常接口声明语法,利用它可以清晰地告诉开发者异常抛出的类型。异常借口声明再次使用了关键字throw,格式为:void f() throw(A,B,C,D);
说明:此函数只能抛出A、B、C、D已经子类型异常。
传统函数void f();意味着能抛出任何一种异常,而void f() throw();则表明不会有异常抛出。

捕获所有异常

C++种可以用一下声明:catch(···){···}来捕获所有类型的异常。
当无法处理有关异常信息时,可通过不加参数的throw来重新抛出异常,使异常进入更高层次的上下文环境,其格式为:

catch(···){
	cot<<"一个异常被抛出!";
	throw;
}

throw只能出现在catch子句的复合语句中,且被抛出的异常就是原来的异常对象

未捕获异常的处理

如果任意层的异常处理器都没有捕获到异常(没有指定相应的catch块),成为未捕获异常。系统的特殊函数terminate()将被自动调用,该函数通过调用abort()来终止程序的执行。