7.1.22 C++处理异常关键字

关键字有:try,throw,catch。

1. 异常机制提供程序中错误检测与错误处理部分之间的通信。C++ 的异常处理

中包括:

1. throw 表达式,错误检测部分使用这种表达式来说明遇到了不可处理的错

误。可以说,throw 引发了异常条件。

2. try 块,错误处理部分使用它来处理异常。try 语句块以 try 关键字开

始,并以一个或多个catch 子句结束。在 try 块中执行的代码所抛出

(throw)的异常,通常会被其中一个 catch 子句处理。由于它们“处理”

异常,catch 子句也称为处理代码。

3. 由标准库定义的一组异常类,用来在 throw 和相应的 catch 之间传递

有关的错误信息。

2. try 块的通用语法形式是:

try {

program-statements

} catch(exception-specifier) {

handler-statements

} catch(exception-specifier) {

handler-statements

} //...

try 块以关键字 try 开始,后面是用花括号起来的语句序列块。try 块后

面是一个或多个 catch 子句。每个 catch 子句包括三部分:关键字 catch,圆

括号内单个类型或者单个对象的声明——称为异常说明符,以及通常用花括号括

起来的语句块。如果选择了一个catch 子句来处理异常,则执行相关的块语句。

一旦 catch 子句执行结束,程序流程立即继续执行紧随着最后一个 catch 子句

的语句。

3. /*vector<string> name;

    string nameTemp;

    cout<<"input name whose lengthless than 8"<<endl;

    while(cin>>nameTemp){

 

    try{

 

    if(nameTemp.size()>=8)

        throwruntime_error("Error!"+nameTemp+"length are more than8bit");

    name.push_back(nameTemp);

    }

    catch(runtime_error err){

       cerr<<err.what()<<endl<<"Try again?Y/N"<<endl;

       char test;

       cin>>test;

       if(test!='Y')

        break;

        else

            cout<<"input name whoselength less than 8"<<endl;

    }

    }

    for(vector<int>::size_typei=0;i!=name.size();++i)

        cout<<endl<<name[i];

 

return 0;*/

 

1.    函数在寻找处理代码的过程中退出:

寻找处理代码的过程与函数调用链刚好相反。抛出一个异常时,首先要搜索

的是抛出异常的函数。如果没有找到匹配的 catch,则终止这个函数的执行,并

在调用这个函数的函数中寻找相配的 catch如果仍然找到相应的处理代码,该

函数同样要终止,搜索调用它的函数。如此类推,继续按执行路径回退,直到找

到适当类型的 catch 为止。

如果不存在处理该异常的catch 子句,程序的运行就要跳转到名为

terminate的标准库函数,该函数在 exception 头文件中定义。这个标准库函

数的行为依赖于系统,通常情况下,它的执行将导致程序非正常退出。

 

标准异常

1. exception 头文件定义了最常见的异常类,它的类名是 exception。这个

类只通知异常的产生,但不会提供更多的信息。

2. stdexcept 头文件定义了几种常见的异常类

 

exception 最常见的问题。

runtime_error  运行时错误:仅在运行时才能检测到问题

range_error 运行时错误:生成的结果超出了有意义的值域范围

overflow_error  运行时错误:计算上溢

underflow_error  运行时错误:计算下溢

logic_error 逻辑错误:可在运行前检测到问题

domain_error  逻辑错误:参数的结果值不存在

invalid_argument  逻辑错误:不合适的参数

length_error  逻辑错误:试图生成一个超出该类型最大长度的对象

out_of_range  逻辑错误:使用一个超出有效范围的值

new 头文件定义了 bad_alloc 异常类型,提供因无法分配内在而由 new

(第 5.11 节)抛出的异常。

 type_info 头文件定义了 bad_cast 异常类型,这种类型将第 18.2 节讨

论。

 

2. 标准库异常类只提供很少的操作,包括创建、复制异常类型对象以及异常类

型对象的赋值。exception、bad_alloc 以及 bad_cast 类型只定义了默认构造

函数(第 2.3.4 节),无法在创建这些类型的对象时为它们提供初值。其他的

异常类型则只定义了一个使用 string 初始化式的构造函数。当需要定义这些异

常类型的对象时,必须提供一想string 参数。string 初始化式用于为所发生

的错误提供更多的信息。

异常类型只定义了一个名为 what 的操作。这个函数不需要任何参数,并且

返回 const char*类型值。它返回的指针指向一个C 风格字符串(第 4.3 节)。

使用 C 风格字符串的目的是为所抛出的异常提出更详细的文字描述。

299

what 函数所返回的指针指向 C 风格字符数组的内容,这个数组的内容依赖

于异常对象的类型。对于接受string 初始化式的异常类型,what函数将返回

该 string 作为 C 风格字符数组。对于其他异常类型,返回的值则根据编译器

的变化而不同。

 

catch(runtime_errorerr){

       cerr<<err.what()<<endl<<"Tryagain? Y/N"<<endl;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值