C++ 异常机制(下)

目录
  • 八、C++标准异常类
  • 九、编写自己的异常类
  • 十、继承在异常中的应用

八、C++标准异常类

C++标准库异常类继承层次中的根类为exception,其定义在exception头文件中,它是C++标准库所有函数抛出异常的基类,exception的接口定义如下:

namespace std {

     class exception {

     public:

          exception() throw();  //不抛出任何异常

          exception(const exception& e) throw();

          exception& operator= (const exception& e) throw();

          virtual ~exception() throw)();

          virtual const char* what() const throw(); //返回异常的描述信息

     };

}

C++ 异常机制(下)

先来看一下 exception 类的直接派生类:

异常名称 说 明
logic_error 逻辑错误。
runtime_error 运行时错误。
bad_alloc 使用 new 或 new[ ] 分配内存失败时抛出的异常。
bad_typeid 使用 typeid 操作一个 NULL 指针,而且该指针是带有虚函数的类,这时抛出 bad_typeid 异常。
bad_cast 使用 dynamic_cast 转换失败时抛出的异常。
ios_base::failure io 过程中出现的异常。
bad_exception 这是个特殊的异常,如果函数的异常列表里声明了 bad_exception 异常,当函数内部抛出了异常列表中没有的异常时,如果调用的 unexpected() 函数中抛出了异常,不论什么类型,都会被替换为 bad_exception 类型。

logic_error 的派生类:

异常名称 说 明
length_error 试图生成一个超出该类型最大长度的对象时抛出该异常,例如 vector 的 resize 操作。
domain_error 参数的值域错误,主要用在数学函数中,例如使用一个负值调用只能操作非负数的函数。
out_of_range 超出有效范围。
invalid_argument 参数不合适。在标准库中,当利用string对象构造 bitset 时,而 string 中的字符不是 0 或1 的时候,抛出该异常。

runtime_error 的派生类:

异常名称 说 明
range_error 计算结果超出了有意义的值域范围。
overflow_error 算术计算上溢。
underflow_error 算术计算下溢。

九、编写自己的异常类

原则:建议继承标准异常类,并重载父类的what函数和析构函数

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<stdexcept>
using namespace std;

class Person {
public:
Person() {
mAge = 0;
}
void setAge(int age) {
if (age < 0 || age > 100) {
throw out_of_range("年龄应该在0-100之间!");
}
this->mAge = age;
}
public:
int mAge;
};
//test01()使用标准库的异常类,下面的exception可以换为out_of_range
void test01() {
Person p;
try {
p.setAge(1000);
}
catch (exception e) {
cout << e.what() << endl;
}
}

//自己写个异常类,重载父类的what函数和析构函数
class MyOutOfRange : public exception {
public:
MyOutOfRange(const char* error) {
pError = new char[strlen(error) + 1];
strcpy(pError, error);
}
~MyOutOfRange() {
if (pError != NULL) {
delete[] pError;
}
}
virtual const char* what() const {
return pError;
};
public:
char* pError;
};

void fun02() {
throw MyOutOfRange("我自己的out_of_range!");
}

void test02() {
try {
fun02();
}
catch (exception& e) {
cout << e.what() << endl;
}
}

int main(void)
{
test01();//结果:年龄应该在0-100之间!
//test02();//结果:我自己的out_of_range!
return 0;
}

十、继承在异常中的应用

异常尽量抛个类对象(基类),不要再用 -1 或 char* 。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

//异常基类
class BaseMyException {
public:
virtual void  what() = 0;
virtual ~BaseMyException() {}
};

class TargetSpaceNullException : public BaseMyException {
public:
virtual void  what() {
cout << "目标空间空!" << endl;
}
~TargetSpaceNullException() {}
};

class SourceSpaceNullException : public BaseMyException {
public:
virtual void  what() {
cout << "源空间为空!" << endl;
}
~SourceSpaceNullException() {}
};
void copy_str(char* taget, char* source) {

if (taget == NULL) {
throw TargetSpaceNullException();
}
if (source == NULL) {
throw SourceSpaceNullException();
}

//int len = strlen(source) + 1;
while (*source != '\0') {
*taget = *source;
taget++;
source++;
}
}
int main(void) {

const char* source = "abcdefg";
char buf[1024] = { 0 };
try {
copy_str(buf, NULL);
}
catch (BaseMyException& ex) {
ex.what();
}

cout << buf << endl;
return 0;
}
//结果:源空间为空!
2021-05-18 原文

C++ 异常机制(下)的相关文章

中澳战略经济对话机制下一切活动无限期暂停 外交部表态

[环球时报-环球网报道 记者白云怡]国家发展改革委6日发表声明称,自即日起,无限期暂停国家发展改革委与澳联邦政府相关部门共同牵头的中澳战略经济对话机制下一切活动.对此,中国外交部发言人汪文斌6日表示, ...

孩子发脾气非娇惯,专家:大脑机制下的自我保护,家长要科学化解

上周跟朋友聚餐,聊起孩子的事情,大家纷纷表示,如果有选择的话,真的不想生娃.如果说生孩子的难度系数是1,那么养孩子的难度系数至少是5,甚至更多. 曾经有人专门做过调查,发现90后这一代人,对于生孩子的 ...

《涨知识啦33》-SBD器件中的肖特基二极管漏电流机制 (下)

<涨知识啦33>-SBD器件中的肖特基二极管漏电流机制 (下) 根据<涨知识啦>第32期可知,随着反向偏压的增大,肖特基二极管漏电流的增幅远远超过了耗尽区内空间电荷产生电流的水 ...

Java基础知识总结(异常机制、集合、JUC、IO)

Java基础知识总结(异常机制、集合、JUC、IO)

想升级研究思路?那赶快学习下这个机制

解螺旋公众号·陪伴你科研的第2559天 癌症的阿克琉斯之踵? 基因突变,肿瘤发生发展的重要原因之一.但由于很多导致基因功能缺失在内的大部分肿瘤相关突变都不是传统小分子药物或者抗体等生物类药物的直接作用 ...

多图示例:阴道镜下6种异常宫颈图像的解读,值得收藏!

阴道镜是一种妇科内窥镜,主要应用于上皮内瘤变.早期宫颈癌及其它下生殖道早期病变的辅助诊断及评估.今天就用详细的图片为大家讲解正常与异常宫颈的阴道镜图像. 正常宫颈阴道镜所见 1 原始鳞状上皮 原始鳞状 ...

干细胞能治疗下腰痛吗?有效果吗?机制什么?

干细胞能治疗椎间盘源性下腰痛吗? 椎间盘退变性疾病中,椎间盘营养供给减少,周围环境缺氧.酸化,椎间盘抗负荷.抗损伤能力下降:细胞外基质成分改变,合成与分解代谢失衡.椎间盘是软骨性,是人体内最大的无血管 ...

《世界经济》文章精粹|全球失衡条件下的货币政策传导机制:基于估值效应视角

作者:宋科,中国人民大学财政金融学院:杨雅鑫,中国人民大学财政金融学院:苏治,中央财经大学统计与数学学院 刊期:<世界经济>2021年第4期 本刊网址:www.jweonline.cn 点 ...

科学家揭示驯化下早期物种形成的基因组调控机制

物种形成是进化生物学的核心问题之一,是生物种群多样性进化的重要驱动力.过去物种形成机制研究多聚焦于已进化出强烈生殖隔离作用的物种或亚种,由此发现了Haldane效应与large X-effect等调控 ...