第10章 异常处理[15页]
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(1) 异常处理程序的编写不再繁琐。在错误有可能出现处写一些代 码,并在后面的单独节中加入异常处理程序。如果程序中多次调用一个 函数,在程序中加入一个函数异常处理程序即可。
(2) 异常发生不会被忽略。如果被调用函数需要发送一条异常处理 信息给调用函数,它可向调用函数发送一描述异常处理信息的对象。如 果调用函数没有捕捉和处理该错误信号,在后续时刻该调用函数将继续 发送描述异常信息的对象,直到异常信息被捕捉和处理为止。
the res is: 20
please input two integers: 10 3
the res is:3.33333
please input two integers: 10 0
error divided by zero
说明:主函数程序中包含了try块,其中的代码可能发生异常。try 中没有列出实际可能发生异常的除法,而是通过调用函数 testdiv( )来判断。函数通过判断除数是否为0来抛出异常对象。
}catch(DivdeByZeroException ex){ cout<<"error"<<ex.what()<<"\n";
break; } cout<<"\n please input two integers:";
} return 0; }
计算机科学与工程学院
西安理工大学
程序运行结果:
please input two integers:100 5
计算机科学与工程学院
西安理工大学
[例10-1] 除数为0的例子。
#include <iostream>
using namespace std;
class DivdeByZeroException{
//定义抛出异常类
const char*ห้องสมุดไป่ตู้message; //异常信息
public:
DivdeByZeroException():message("divided by zero"){}
抛出异常语法如下: throw ourerror("some error happened");
其中ourerror是一个普通的自定义类。如有异常抛出,可以使用任意 类型变量作为参数。
计算机科学与工程学院
西安理工大学
3.异常捕获
如果函数内抛出一个异常(或在调用函数时抛出一个异常),则在异 常抛出时系统会自动退出所在函数的执行。由关键字try引导,异常抛 出后,由catch引导的异常处理模块应能接受任何类型的异常。在try之 后,根据异常的不同情况,相应的处理方法由关键字catch引导。语法 如下:
一条语句执行下去。 (3) 如果发生异常,则根据throw抛出的异常对象类型来匹配一个
catch语句(此catch能处理此种类型的异常,即catch后的参数类 型与throw抛出异常对象类型一致)。如果找到类型匹配的catch 语句,进行捕获,其参数被初始化为指向异常对象,执行相应 catch内的语句模块;如果找不到匹配类型的catch语句,系统函 数terminate被调用,终止程序。
const char* what(){return message;}
};
double testdiv(int num1,int num2)
//除法函数
{
if(num2==0)
//判断除数是否为0
throw DivdeByZeroException(); //抛出异常
return (double)num1/num2;
C++中可以声明: catch(……){ } 来捕获所有类型的异常。
计算机科学与工程学院
西安理工大学
第十章 异常处理
学习目标
用try、throw和catch分别监视、指定和处理异常。 处理未捕获和未预料的异常。 理解标准异常层次结构。
计算机科学与工程学院
西安理工大学
1. 异常处理概述
C++的异常处理是一种允许两个独立开发的程序组件在程序执行期间 遇到程序不正常执行的情况(称为异常)时,相互通信的机制。具有以下 特点:
DivideByZeroException类的构造函数将message数据成员指向字符 串divided by zero。catch处理程序指定的参数(这里参数为ex) 接受抛出的对象,并通过调用函数what打印这个消息。
执行中,如果try块中的代码没有抛出异常,则立即跳过try块后面 的所有catch异常处理程序,执行catch后面的第一条语句。
计算机科学与工程学院
西安理工大学
2.抛出异常
如果程序发生异常情况,而在当前的上下文环境中获取异常处理的 足够信息,可以创建一个包含出错信息的对象并将此对象抛出当前的上 下文环境,将出错信息发送到更大的上下文环境中,称为异常抛出。 throw ourerror("some error happened");
try{
//可能发生错误的代码
}catch(type1 t1){
//第一种类型异常处理
}catch(type2 t2){
//第二种类型异常处理
}
……
//其他类型异常处理
计算机科学与工程学院
西安理工大学
异常处理的执行流程如下: (1) 程序进入到try块,执行try块内的代码。 (2) 如果在try块内没有发生异常,则直接转到所有catch块后的第
}
计算机科学与工程学院
西安理工大学
int main() {
int num1,num2; double res; cout<<"please input two integers:"; while(cin>>num1>>num2){
try{ res=testdiv(num1,num2); cout<<"the res is :"<<res<<endl;
计算机科学与工程学院
西安理工大学
void f() throw(A,B,C,D); C++语言提供了异常接口声明语法,利用它可以清晰地告诉使用 者异常抛出的类型。异常接口声明再次使用了关键字throw,语法 如下:
void f() throw(A,B,C,D);
说明:此函数只能抛出A、B、C、D及其子类型异常。 而传统函数:void f();意味着能抛出任何一种异常。 void f() throw();表明函数不会有异常抛出。
(2) 异常发生不会被忽略。如果被调用函数需要发送一条异常处理 信息给调用函数,它可向调用函数发送一描述异常处理信息的对象。如 果调用函数没有捕捉和处理该错误信号,在后续时刻该调用函数将继续 发送描述异常信息的对象,直到异常信息被捕捉和处理为止。
the res is: 20
please input two integers: 10 3
the res is:3.33333
please input two integers: 10 0
error divided by zero
说明:主函数程序中包含了try块,其中的代码可能发生异常。try 中没有列出实际可能发生异常的除法,而是通过调用函数 testdiv( )来判断。函数通过判断除数是否为0来抛出异常对象。
}catch(DivdeByZeroException ex){ cout<<"error"<<ex.what()<<"\n";
break; } cout<<"\n please input two integers:";
} return 0; }
计算机科学与工程学院
西安理工大学
程序运行结果:
please input two integers:100 5
计算机科学与工程学院
西安理工大学
[例10-1] 除数为0的例子。
#include <iostream>
using namespace std;
class DivdeByZeroException{
//定义抛出异常类
const char*ห้องสมุดไป่ตู้message; //异常信息
public:
DivdeByZeroException():message("divided by zero"){}
抛出异常语法如下: throw ourerror("some error happened");
其中ourerror是一个普通的自定义类。如有异常抛出,可以使用任意 类型变量作为参数。
计算机科学与工程学院
西安理工大学
3.异常捕获
如果函数内抛出一个异常(或在调用函数时抛出一个异常),则在异 常抛出时系统会自动退出所在函数的执行。由关键字try引导,异常抛 出后,由catch引导的异常处理模块应能接受任何类型的异常。在try之 后,根据异常的不同情况,相应的处理方法由关键字catch引导。语法 如下:
一条语句执行下去。 (3) 如果发生异常,则根据throw抛出的异常对象类型来匹配一个
catch语句(此catch能处理此种类型的异常,即catch后的参数类 型与throw抛出异常对象类型一致)。如果找到类型匹配的catch 语句,进行捕获,其参数被初始化为指向异常对象,执行相应 catch内的语句模块;如果找不到匹配类型的catch语句,系统函 数terminate被调用,终止程序。
const char* what(){return message;}
};
double testdiv(int num1,int num2)
//除法函数
{
if(num2==0)
//判断除数是否为0
throw DivdeByZeroException(); //抛出异常
return (double)num1/num2;
C++中可以声明: catch(……){ } 来捕获所有类型的异常。
计算机科学与工程学院
西安理工大学
第十章 异常处理
学习目标
用try、throw和catch分别监视、指定和处理异常。 处理未捕获和未预料的异常。 理解标准异常层次结构。
计算机科学与工程学院
西安理工大学
1. 异常处理概述
C++的异常处理是一种允许两个独立开发的程序组件在程序执行期间 遇到程序不正常执行的情况(称为异常)时,相互通信的机制。具有以下 特点:
DivideByZeroException类的构造函数将message数据成员指向字符 串divided by zero。catch处理程序指定的参数(这里参数为ex) 接受抛出的对象,并通过调用函数what打印这个消息。
执行中,如果try块中的代码没有抛出异常,则立即跳过try块后面 的所有catch异常处理程序,执行catch后面的第一条语句。
计算机科学与工程学院
西安理工大学
2.抛出异常
如果程序发生异常情况,而在当前的上下文环境中获取异常处理的 足够信息,可以创建一个包含出错信息的对象并将此对象抛出当前的上 下文环境,将出错信息发送到更大的上下文环境中,称为异常抛出。 throw ourerror("some error happened");
try{
//可能发生错误的代码
}catch(type1 t1){
//第一种类型异常处理
}catch(type2 t2){
//第二种类型异常处理
}
……
//其他类型异常处理
计算机科学与工程学院
西安理工大学
异常处理的执行流程如下: (1) 程序进入到try块,执行try块内的代码。 (2) 如果在try块内没有发生异常,则直接转到所有catch块后的第
}
计算机科学与工程学院
西安理工大学
int main() {
int num1,num2; double res; cout<<"please input two integers:"; while(cin>>num1>>num2){
try{ res=testdiv(num1,num2); cout<<"the res is :"<<res<<endl;
计算机科学与工程学院
西安理工大学
void f() throw(A,B,C,D); C++语言提供了异常接口声明语法,利用它可以清晰地告诉使用 者异常抛出的类型。异常接口声明再次使用了关键字throw,语法 如下:
void f() throw(A,B,C,D);
说明:此函数只能抛出A、B、C、D及其子类型异常。 而传统函数:void f();意味着能抛出任何一种异常。 void f() throw();表明函数不会有异常抛出。