| |
|
开发:
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
表达式产生异常。
示例如下:
异常对象和异常类及异常类的用法
?
异常是某种对象。最简单的异常对象可以设计为整数或字符串:
?
大部分情况下被抛出的异常都属于特定的
异常类
(这些类可能形成一个继承体系)。示例如下
——
iterator_overflow
异常类的定义:
?
上述类存储必要数据(比如下标值
_index
和数组最大长度值
_max
)用以表示异常的性质
?
throw
iterator_overflow
(_
index,Triangular
::_
max_elems
);
调用
iterator_overflow
类类主体内定义的构造函数。
?
也可以明确指出被抛出的异常类类对象名称:
2.?捕获异常
?
catch
子句捕获被抛出的异常(类)对象,
catch
子句可以是一条,或者一连串
?
catch
由三部分组成:
关键字
catch()
内的一个数据类型、
{}
内的一组语句(用以处理异常)。
示例如下:
?
如果想要捕获任何类型的异常,
只需要在异常声明部分指定省略号
(…)
(注意,英文省略号!)即可,示例如下:
? ?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异常对象,示例如下:
解析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语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年12日历 | -2024/12/26 4:04:05- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |