的第10章异常处理 第10章异常处理 10.1异常处理机制 10.2异常处理的实现 10.3异常处理中的构造与析构 BACK
第10章 异常处理 第10章 异常处理 10.1 异常处理机制 10.2 异常处理的实现 10.3 异常处理中的构造与析构
的第10章异常处理 10.1异常处理机制 在一个大型软件中,由于函数之间有着明确的分 工和复杂的调用关系,发现错误的函数往往不具备处 理错误的能力。因此,C++语言异常处理机制的基本 思想是将异常的检测与处理分离。当在一个函数体中 检测到异常条件存在,但却无法确定相应的处理方法 时,该函数将引发一个异常,由函数的直接或间接调 用者捕获这个异常并处理这个错误
第10章 异常处理 10.1 异常处理机制 在一个大型软件中,由于函数之间有着明确的分 工和复杂的调用关系,发现错误的函数往往不具备处 理错误的能力。因此,C++语言异常处理机制的基本 思想是将异常的检测与处理分离。当在一个函数体中 检测到异常条件存在,但却无法确定相应的处理方法 时,该函数将引发一个异常,由函数的直接或间接调 用者捕获这个异常并处理这个错误
的第10章异常处理 如果程序始终没有处理这个异常,最终它会被传 到C艹运行系统那里,运行系统捕获异常后,通常只 是简单地终止这个程序 由于异常处理机制使得异常的引发和处理不必在 同一函数中,这样,底层的函数可以着重解决具体问 题而不必过多地考虑对异常的处理;上层调用者可以 在适当的位置设计对不同类型异常的处理 BACK
第10章 异常处理 如果程序始终没有处理这个异常,最终它会被传 到C++运行系统那里,运行系统捕获异常后,通常只 是简单地终止这个程序。 由于异常处理机制使得异常的引发和处理不必在 同一函数中,这样,底层的函数可以着重解决具体问 题而不必过多地考虑对异常的处理;上层调用者可以 在适当的位置设计对不同类型异常的处理
的第10章异常处理 102异常处理的实现 1021异常处理的语法 1. throw语法 throw 当某段程序发现了自己不能处理的异常,就可以使 用 throw语句将这个异常抛掷给调用者。 throw语句的使 用与 return语句相似,如果程序中有多处要抛掷异常, 应该用不同的表达式类型来互相区别,表达式的值不 能用来区别不同的异常
第10章 异常处理 10.2 异常处理的实现 10.2.1 异常处理的语法 1.throw语法 throw; 当某段程序发现了自己不能处理的异常,就可以使 用throw语句将这个异常抛掷给调用者。throw语句的使 用与return语句相似,如果程序中有多处要抛掷异常, 应该用不同的表达式类型来互相区别,表达式的值不 能用来区别不同的异常
的第10章异常处理 2.try块语法 复合语句 try语句后的复合语句是代码的保护段。如果预料 某段程序代码(或对某个函数的调用)有可能发生异常, 就将它放在try语句之后。如果这段代码(或被调函数) 运行时真的遇到异常情况,其中的 Throw表达式就会抛 掷这个异常
第10章 异常处理 2.try块语法 try { 复合语句 } try语句后的复合语句是代码的保护段。如果预料 某段程序代码(或对某个函数的调用)有可能发生异常, 就将它放在try语句之后。如果这段代码(或被调函数) 运行时真的遇到异常情况,其中的throw表达式就会抛 掷这个异常
H 第10章异常处理 3. catch语法 catch(异常类型1参数1) /对异常类型1的处理语句 catche(异常类型2参数2) /对异常类型2的处理语句 catche(异常类型n参数n)
第10章 异常处理 3.catch语法 catch(异常类型1参数1) { //针对异常类型1的处理语句 } catch(异常类型2参数2) { //针对异常类型2的处理语句 } ... catch(异常类型n参数n)
的第10章异常处理 /对异常类型n的处理语句 catch语句后的复合语句是异常处理程序,捕获由 throw表达式抛掷的异常。异常类型声明部分指明语句 所处理的异常类型,它与函数的形参相类似,可以是 某个类型的值,也可以是引用。这里的类型可以是任 何有效的数据类型,包括C++的类。当异常被抛掷以 后, catch语句便依次被检查
第10章 异常处理 { //针对异常类型n的处理语句 } catch语句后的复合语句是异常处理程序,捕获由 throw表达式抛掷的异常。异常类型声明部分指明语句 所处理的异常类型,它与函数的形参相类似,可以是 某个类型的值,也可以是引用。这里的类型可以是任 何有效的数据类型,包括C++的类。当异常被抛掷以 后,catch语句便依次被检查
H 第10章异常处理 1022异常处理的执行过程 异常处理的执行过程如下 ①控制通过正常的顺序执行到达ty语句,然后执行tr 块内的保护段 ②如果在保护段执行期间没有引起异常,那么跟在try 块后的 catch语句就不执行,程序从异常被抛掷的try块后 跟随的最后一个 catch语句后面的语句继续执行下去 ③如果在保护段执行期间或在保护段调用的任何函数 中(直接或间接的调用)有异常被抛掷,则从通过hrow创建 的对象中创建一个异常对象(这隐含指可能包含一个拷贝 构造函数)
第10章 异常处理 10.2.2 异常处理的执行过程 异常处理的执行过程如下: ①控制通过正常的顺序执行到达try语句,然后执行try 块内的保护段。 ②如果在保护段执行期间没有引起异常,那么跟在try 块后的catch语句就不执行,程序从异常被抛掷的try块后 跟随的最后一个catch语句后面的语句继续执行下去。 ③如果在保护段执行期间或在保护段调用的任何函数 中(直接或间接的调用)有异常被抛掷,则从通过throw创建 的对象中创建一个异常对象(这隐含指可能包含一个拷贝 构造函数)
的第10章异常处理 这一点上,编译器能够处理抛掷类型的异常,在 更高执行上下文中寻找一个 catch语句(或一个能处理任 何类型异常的 catch处理程序)。 catch处理程序按其在try 块后出现的顺序被检查。如果没有找到合适的处理程 序,则继续检査下一个动态封闭的ty块。此处理继续 下去,直到最外层的封闭try块被检查完
第10章 异常处理 这一点上,编译器能够处理抛掷类型的异常,在 更高执行上下文中寻找一个catch语句(或一个能处理任 何类型异常的catch处理程序)。catch处理程序按其在try 块后出现的顺序被检查。如果没有找到合适的处理程 序,则继续检查下一个动态封闭的try块。此处理继续 下去,直到最外层的封闭try块被检查完
的第10章异常处理 ④如果匹配的处理器未找到,则 terminate将被自 动调用,而函数 terminate的默认功能是调用 abort终止 程序。 ⑤如果找到了一个匹配的 catch处理程序,且它通 过值进行捕获,则其形参通过拷贝异常对象进行初始 化。如果它通过引用进行捕获,则参量被初始化为指 向异常对象,在形参被初始化之后,“循环展开栈” 的过程开始。这包括对那些在与 catch处理器相对应的 try块开始和异常丢弃地点之间创建的(但尚未析构的) 所有自动对象的析构
第10章 异常处理 ④如果匹配的处理器未找到,则terminate()将被自 动调用,而函数terminate()的默认功能是调用abort终止 程序。 ⑤如果找到了一个匹配的catch处理程序,且它通 过值进行捕获,则其形参通过拷贝异常对象进行初始 化。如果它通过引用进行捕获,则参量被初始化为指 向异常对象,在形参被初始化之后,“循环展开栈” 的过程开始。这包括对那些在与catch处理器相对应的 try块开始和异常丢弃地点之间创建的(但尚未析构的) 所有自动对象的析构