C++第10章 异常处理和跟踪调试

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

异常处理
4.异常规范 指出函数可以抛出的所有异常类型名。 语法:值类型 函数名(形参表) throw(类型名表) 函数体 若无异常接口声明,则此函数可以抛掷任何类型的异常。 不抛掷任何类型异常的函数声明如下: #include <iostream> using namespace std; void function(int x) throw() { if(x == 1) throw 1; } 无异常规范表示可抛出任何异常。 void function(int x){ if(x == 1) throw 1.5; }
10-1-1 异常处理的基本思想
f( )
异常处理 继续运行
g( )
k( )
发生异常
函数调用链
10-1-2 异常的实现及基本规则
异常处理机制
#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) 5/2=2 { if(y==0) throw y; except of deviding return x/y; that is ok. }
异常处理
程序二; #include <iostream> using namespace std; void fun(int x){ try{ if(x == 1) throw 1; if(x == 2) throw 1.0; if(x == 3) throw "1"; }catch(int){ cout << "catch an int in fun()" << endl; }catch(double){ cout << "catch an double in fun()" << endl; } cout << "testing exception in fun()..."<< endl;}
char& operator[ ](int k) { if(0<=k && k<len) return p[k]; throw Range(k); }
10-2 多路捕捉
if(si<0 || max<si) throw Size(); try{ //代码区2 String s("abcdefghijklmnop", 10); g(s); } catch(String::Range r) { cerr <<"->out of range: " <<r.index <<endl; //代码区3 } catch(String::Size) { cerr <<"size illegal!\n"; }
10-2 多路捕捉
多数程序可能有若干不同种类的运行错误,它们 可以用异常处理机制。 每种错误可与一个类、一个数据类型或一个值有 关。这样,在程序中就会出现多路捕获。
10-2 多路捕捉
class Range { //异常类1 public: Range(int j):index(j){} int index; }; class Size{ }; //异常类2
异常处理
3.扑获所有异常 catch(...){ } 例: #include <iostream> using namespace std; void fun() { try{ }catch(...){ cout << "catch all exception ..." << endl; }catch(int){ cout << "catch int exception ..." << endl; } }
构成异常族系的一些示例有
• 数学错误异常族系 • 文件处理错误异常族系。
在c++代码中把异常组在一起有两种方式:
异常枚举族系 异常派生层次结构。
10-4 使用异常的方法
例如,下面的代码是一个异常枚举族系的例子:
enum FileErrors{nonExist, wrongFormat, diskSeekError .... }; try { //... throw wrongFormat; } catch(FileErrors fe) { switch(re) { case nonExist: //... case wrongFormat: //... case diskSeekError: //...
本章总结
异常是程序实时运 行的错误,为了不让 程序终止,进行捕获
异常概念
异常的基本思想
异常的实现和基本规则
多路捕捉 异常处理和跟踪调试 异常处理机制
多数程序可能有若 干不同种类的运行 错误,它们都可以 用异常处理机制。
throw 要及时跟踪处 理
使用异常的方法
可以把多个异常组 成族系。
实验
任务1:捕获异常
任务1 注意事项
提示:

注意异常处理完后程序的流程
第九章内容回顾
模板的概念 模板函数 类模板 标准模板库
第十章
异常Fra Baidu bibliotek理和跟踪
预习检查
捕获异常的关键字是什么? 举出一个异常的例子?
3
本章结构
异常的基本思想
异常概念
异常的实现和基本规则
多路捕捉 异常处理和跟踪调试 异常处理机制
使用异常的方法
10-1 异常概念
程序的错误,一种是编译错误,即语法错误 另一种是在运行时发生的错误
10-3 异常处理机制
异常处理机制


若有异常则通过throw操作创建一个异常对象并抛掷。 将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺序执行到达try语句,然后执行 try块内的保护段。 如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行。程序从try块 后跟随的最后一个catch子句后面的语句继续执行下去。 catch子句按其在try块后出现的顺序被检查。匹配的catch子句将捕获并处理异常(或继续抛 掷异常)。 如果匹配的处理器未找到,则运行函数terminate将被自动调用,其缺省功能是调用abort终止 程序
异常处理
#include <iostream.h> #include <math.h> double sqrt_delta(double d) { if(d < 0) throw 1; return sqrt(d); } void main() { try { cout<<sqrt_delta(10)<<endl; }catch(int) { cout << "exception"; } }
zero.
10-1-2 异常的实现及基本规则
编写异常处理程序的规则是
任意数量的catch分程序立即出现在try分程序之后。 在catch行的圆括号中可包含数据类型声明 如果一个函数抛掷一个异常, 但在通往异常处理函数的调用链中找不到与之匹配 的catch,则该程序通常以abort()函数调用终止
10-1-1 异常处理的基本思想
调用者 函数f()捕获并处理异常 ……
调用关系
异常传播方向
函数g()
函数h()
引发异常
10-1-1 异常处理的基本思想
抛掷异常的程序段
...... throw ...... 表达式;
捕获并处理异常的程序段
try 复合语句 catch(异常类型声明) 复合语句 catch(异常类型声明) 复合语句 …
10-4 使用异常的方法
对于类的派生,下列情况可以捕获异常:
异常处理的数据类型是公有基类,抛掷异常的数据类型是派生类;
异常处理的数据类型是指向公有基类的指针, 抛掷异常的数据类型是指向派生类 的指针。
>对于派生层次结构的异常处理, catch块组中的 顺序是重要的。
异常处理
程序的两种状态: 正常状态和异常状态,发生不正常情况后,进入异常状态,从当前函数开始, 按调用链的相反次序,查找处理该异常的程序片断 1.throw 表达式 语义:用表达式的值生成一个对象(异常对象),程序进入异常状态。终止程 序的执行。 2.try-catch语句 try{ 包含可能抛出异常的语句; }catch(类型名 [形参名]){ 异常处理 }catch(类型名 [形参名]){ 异常处理 }
异常处理
void gun(){ try{ //fun(1); //fun(2); //fun(3); fun(4); }catch(char){ cout << "catch a char in gun()" << endl; } cout << "testing exception in gun()..."<< endl; } int main() { gun(); }
10-3 异常处理机制
异常处理机制
f( ) g( ) try Range(size)
h( ) H1( )
try try Size throw Throw range
Throw size
h2( )
Throw matherr
h3( )
Throw size
10-4 使用异常的方法
多个异常组成族系
不可预料的逻辑错误
• 逻辑错误是由于不当的设计造成的
可以预料的运行异常
• 运行异常.可以预料,但不能避免,它是由系统运行环境造成 的。 • 然而这些错误是能够预料的,通常加入一些预防代码便可防止 这些异常
10-1 异常概念
异常处理的基本思想 C++异常处理的实现 异常处理中的构造与析构
异常处理
对于函数指针,例如: #include <iostream> using namespace std; void function(int x)throw(int) { if(x == 1) throw 1; } int main() { void (*fp)(int)throw(int);//不是必须的 fp = function; fp(1); //应该置于try…catch语句中 }
10-1-1 异常处理的基本思想
异常的基本思想是
(1)实际的资源分配(如内存申请或文件打开)通常在程序的低层进行
(2)当操作失败、无法分配内存或无法打开一个文件时, 在逻辑上如何进行处理通 常是在程序的高层
(3)异常为从分配资源的代码转向处理错误状态的代码提供了—种表达方式。如果 还存在中间层次的函数,则为它们释放所分配的内存提供了机会,但这并不包括 用于传递错误状态信息的代码。
相关文档
最新文档