清华大学C++程序设计 第十二章 异常处理

更新时间:2023-09-04 18:15:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

清华大学C++程序设计

C++语言程序设计

第十二章 异常处理清华大学 郑 莉

清华大学C++程序设计

C++语言程序设计

清华大学 郑莉

本章主要内容

异常处理的基本思想 C++异常处理的实现 异常处理中的构造与析构

清华大学C++程序设计

C++语言程序设计

清华大学 郑莉

异常处理的基本思想调用者 函数f()捕获并处理异常 ……

调用关系

异常传播方向

函数g()

函数h()

引发异常3

清华大学C++程序设计

C++语言程序设计

清华大学 郑莉

异常处理的实现机制

抛掷异常的程序段 ...... throw ......

表达式;

捕获并处理异常的程序段 try 复合语句 catch(异常类型声明) 复合语句 catch(异常类型声明) 复合语句 …

清华大学C++程序设计

C++语言程序设计

清华大学 郑莉

异常处理的实现机制若有异常则通过throw操作创建一个异常对象并抛掷。 将可能抛出异常的程序段嵌在try块之中。控制通过正 常的顺序执行到达try语句,然后执行try块内的保护段。 如果在保护段执行期间没有引起异常,那么跟在try块 后的catch子句就不执行。程序从try块后跟随的最后一 个catch子句后面的语句继续执行下去。 catch子句按其在try块后出现的顺序被检查。匹配的 catch子句将捕获并处理异常(或继续抛掷异常)。 如果匹配的处理器未找到,则运行函数terminate将被 自动调用,其缺省功能是调用abort终止程序。

清华大学C++程序设计

C++语言程序设计

清华大学 郑莉

例12-1处理除零异常#include<iostream.h> int Div(int x,int y); int main() { try { cout<<"5/2="<<Div(5,2)<<endl; cout<<"8/0="<<Div(8,0)<<endl; cout<<"7/1="<<Div(7,1)<<endl; } catch(int) { cout<<"except of deviding zero.\n"; } cout<<"that is ok.\n"; } int Div(int x,int y) 程序运行结果如下: { if(y==0) throw y; 5/2=2 return x/y; } except of deviding zero.

that is ok.6

清华大学C++程序设计

C++语言程序设计

清华大学 郑莉

异常接口声明

可以在函数的声明中列出这个函数可 能抛掷的所有异常类型。–例如: void fun() throw(A,B,C,D);

若无异常接口声明,则此函数可以抛 掷任何类型的异常。 不抛掷任何类型异常的函数声明如下:

void fun() throw();7

清华大学C++程序设计

C++语言程序设计

清华大学 郑莉

异常处理中的构造与析构

找到一个匹配的catch异常处理后: – 初始化参数。 – 将从对应的try块开始到异常被抛掷 处之间构造(且尚未析构)的,所 有自动对象进行析构。 – 从最后一个catch处理之后开始恢复 执行。8

清华大学C++程序设计

C++语言程序设计

清华大学 郑莉

例12-2 异常处理时的析构#include <iostream.h> void MyFunc( void ); class Expt { public: Expt(){}; ~Expt(){}; const char *ShowReason() const { return "Expt类异常。"; } };9

清华大学C++程序设计

class Demo { public: Demo(); ~Demo(); }; Demo::Demo() { cout<<"构造 Demo."<<endl; } Demo::~Demo() { cout<<"析构 Demo."<<endl; }10

清华大学C++程序设计

void MyFunc() { Demo D

; cout<<"在MyFunc()中抛掷Expt类异常。"<<endl; throw Expt(); } int main() { cout<<"在main函数中。"<<endl; try { cout<<"在try块中,调用MyFunc()。" <<endl; MyFunc(); }11

清华大学C++程序设计

catch( Expt E ) { cout<<"在catch异常处理程序中。"<<endl; cout<<"捕获到Expt类型异常:"; cout<<E.ShowReason()<<endl; } catch( char *str ) { cout<<"捕获到其它的异常:"<<str<<endl;} cout<<"回到main函数。从这里恢复执行。" <<endl; return 0;

}12

清华大学C++程序设计

程序运行时输出:在main函数中。 在try块中,调用MyFunc()。 构造 Demo. 在MyFunc()中抛掷Expt类异常。 析构 Demo. 在catch异常处理程序中。 捕获到Expt类型异常:Expt类异常。 回到main函数。从这里恢复执行。

本文来源:https://www.bwwdw.com/article/nw7i.html

Top