c++标准库异常以及编写自己的异常类的写法

本文介绍了C++中的标准库异常,包括logic_error和runtime_error两类异常及其子类的使用,并详细阐述了如何编写自己的异常类,强调了自定义异常类的必要性和实现方式。通过示例代码展示了标准库异常的抛出和捕获,以及自定义异常类的构造和使用,帮助读者深入理解C++异常处理机制。

目录

一、c++标准库异常

1、8个标准异常类的成员:

2、8个标准异常类的具体描述:

二、编写自己的异常类

1. 为什么要编写自己的异常类?

2. 如何编写自己的异常类?

三、标准库异常和自己的异常类案例代码:


一、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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值