目录
一、c++标准库异常
标准库中也提供了很多的异常类,它们是通过类继承组织起来的。标准异常被组织成八 个。 异常类继承层级结构图如下:

每个类所在的头文件在图下方标识出来。
1、8个标准异常类的成员:
① 在上述继承体系中,每个类都有提供了构造函数、复制构造函数、和赋值操作符重载。
② logic_error 类及其子类、runtime_error 类及其子类,它们的构造函数是接受一个 string 类型的形式参数,用于异常信息的描述
③ 所有的异常类都有一个 what()方法,返回 const char* 类型(C 风格字符串)的值,描 述异常信息。
2、8个标准异常类的具体描述:


2.1、logic_error 类及其子类

2.2、runtime_error 类及其子类

二、编写自己的异常类
1. 为什么要编写自己的异常类?
① 标准库中的异常是有限的;
② 在自己的异常类中,可以添加自己的信息。(标准库中的异常类值允许设置一个用来描述 异常的字符串)。
2. 如何编写自己的异常类?
① 建议自己的异常类要继承标准异常类。因为 C++中可以抛出任何类型的异常,所以我们 的异常类可以不继承自标准异常,但是这样可能会导致程序混乱,尤其是当我们多人协同开 发时。
② 当继承标准异常类时,应该重载父类的 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;
};
void test01(){
Person p;
try{
p.setAge(1000);
}
catch (exception& e){
cout << e.what() << endl;
}
}
//自定义异常类
class MyOutRangeException : public exception {
public:
MyOutRangeException(const char* error) {
int len = strlen(error) + 1;
this->pError = new char[len];
strcpy(this->pError, error);
}
virtual const char* what() const {
return this->pError;
}
virtual ~MyOutRangeException() {
cout << "析构函数!" << endl;
if (pError != NULL) {
delete[] this->pError;
}
}
public:
char* pError;
};
void fun02()
{
throw MyOutRangeException("我自己的out_of_range!");
}
void test02(){
try{
fun02();
}
catch (exception& e){
cout << e.what() << endl;
}
}
int main(void)
{
//test01();
test02();
return 0;
}
本文介绍了C++中的标准库异常,包括logic_error和runtime_error两类异常及其子类的使用,并详细阐述了如何编写自己的异常类,强调了自定义异常类的必要性和实现方式。通过示例代码展示了标准库异常的抛出和捕获,以及自定义异常类的构造和使用,帮助读者深入理解C++异常处理机制。
538

被折叠的 条评论
为什么被折叠?



