IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++异常处理 -> 正文阅读

[C++知识库]C++异常处理

1.?抛出异常

介绍异常及其处理

? 异常处理机制两个主要成分:①异常 的鉴定与 发出②异常的处理方式
? 异常产生及处理都可能发生在函数上
? 异常出现之后,程序的执行便被暂停,同时 异常处理机制搜索程序中有能力处理异常的地点
? 异常处理完毕,程序 继续在异常处理点 接着执行
? C++ 通过 throw 表达式产生异常。 示例如下:

异常对象和异常类及异常类的用法

? 异常是某种对象。最简单的异常对象可以设计为整数或字符串:
throw 42;
throw "panic:no buffer!";
? 大部分情况下被抛出的异常都属于特定的 异常类 (这些类可能形成一个继承体系)。示例如下 —— iterator_overflow 异常类的定义:
class iterator_overflow{
public:
    iterator_overflow(int index,int max):_index(index),_max(max){}
    //异常类的类构造函数
    int index(){return _index;}
    int max(){return _max;}
    void what_happened(ostream &os=cerr)//提供默认参数值
    //即把输出绑定在cerr上
    {
        os<<"Internal error:current index"<<_index<<"exceeds maximum bound:"<<_max;
    }
private:
    int _index;
    int _max;
};
? 上述类存储必要数据(比如下标值 _index 和数组最大长度值 _max )用以表示异常的性质
? throw iterator_overflow (_ index,Triangular ::_ max_elems ); 调用 iterator_overflow 类类主体内定义的构造函数。
? 也可以明确指出被抛出的异常类类对象名称:
if(_index>=Triangular::max_elems)
{
    iterator_overflow ex(_index,Triangular::_max_elems);
    throw ex;
}

2.?捕获异常

? catch 子句捕获被抛出的异常(类)对象, catch 子句可以是一条,或者一连串
? catch 由三部分组成: 关键字 catch() 内的一个数据类型、 {} 内的一组语句(用以处理异常)。 示例如下:
bool some_function()
{
    bool status = true;
    catch(int errno)
    {
        log_message(err_messages[errno]);
        status = false;
    }
    catch(const char *str)
    {
        //...
    }
     catch(iterator_overflow &iof)
    {
        //...
    }
    return status;
}

? 如果想要捕获任何类型的异常, 只需要在异常声明部分指定省略号 (…) (注意,英文省略号!)即可,示例如下:

?


?3.?提炼异常

try块介绍

try块以关键字try作为开始,然后{}catch子句放在{}之后。示例如下:

?catch子句放在try块的末尾(“{”之后)表示如果try块内有任何异常发生,便执行catch子句

当函数的try块发生某个异常,但并没有相应的catch子句将它捕获,此函数便会被中断,由异常处理机制接管,沿着“函数调用链”一路回溯,搜寻符合条件的catch子句。


4.?局部资源管理

函数执行之初所分配的资源不一定最终会被释放掉。比如某函数里使用了new表达式从堆内存里分配空间给一个对象,然后对象地址分配给了一个指针。假如这个操作执行完以后,在释放资源的语句之前这个函数或这个函数内调用的函数抛出了异常,而且没在这个函数里解决,那么释放资源的语句不会被执行,这就存在内存泄露的问题。

如何解决呢?

需要资源管理

? 对于类对象而言,初始化操作发生于类构造函数内,资源的请求也应该在构造函数内完成。资源的释放应该放在析构函数中完成。(不过这样无法将资源管理自动化)
? auto_ptr 自动化管理。 auto_ptr C++ 标准库提供的模板类。其作用:它会自动删除通过 new 表达式分配的对象。 auto_ptr 将 * 运算符和 -> 运算符予以重载,故我们可以像使用一般指针一样地使用 auto_ptr 对象。

?5.?标准异常

?如果new表达式无法从程序的空闲空间分配到足够的内存,则抛出bad_alloc异常对象,示例如下:

vector<string>*init_text_vector(ifstream &infile)
{
    vector<string>*ptext=0;
    try
    {
        ptext=new vector<string>;
    }
    catch(bad_alloc)
    {
        cerr<<"...";
    //处理异常,然后退出catch子句
    }
    return ptext;
}

解析new表达式的具体工作过程ptext=new vector<string>为例

? 分配足够内存
? vector<string> 默认构造函数应用于堆对象之上
? 然后再将对象地址赋值给 ptext vector<string> 指针(如果没有足够的内存足以分配给 vector<string> 对象, vector<string> 对象默认构造函数不会被调用, ptext 也不会被赋值对象地址。一切这样的现象产生是因为 bad_alloc 异常对象会被抛出。程序流程调到紧接的 try 块后的 catch 子句)
?

C++标准库定义了一套异常类体系

? 抽象基类是 exception 异常类,该抽象类声明了一个 what() 虚函数,返回 const char * 用以表示被抛出异常的文字描述
? bad_alloc 异常类派生自 exception 基类,它有自己的 what 成员函数。

同样我们可以自己编写异常类继承于exception基类,当然必须要包含头文件#Include<exception>

ostringstream

? ostringstream class 提供“内存内的输出操作”,输出到一个 string 对象上。
? 作用基类对象时可以将很多不同类型的数据格式化为字符串。(其他类型对象 -> string 型对象)
? ostringstream 提供一个成员函数 str() ,将接受转换成字符串的 string 对象返回( return )。
? string 类的成员函数转换函数 c_str () string 类型对象转换成 const char* 类型对象, 并将转换成的 const char* 型对象返回( return
? 使用 ostringstream 类之前,需要包含头文件 #include<sstream>

istringstream

作用:其类对象可以将实际上应为非字符的数据(整数值、内存地址等)的字符串表示转换为其实际类型string类型对象 -> 其他类型对象)(ostringstream类作用的逆过程)

使用istringstream类之前,必须包含头文件#include<sstream>

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-06 15:54:00  更:2021-08-06 15:54:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 2:48:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码