C++异常

try{} catch{}; 如果程序中抛出的异常没有被捕获,程序将异常中止

一、异常的语法

1)捕获全部的异常

    try
    {

        // 可能抛出异常的代码。

        // throw 异常对象;

    }

    catch (...)
    {

        // 不管什么异常,都在这里统一处理。

    }

2)捕获指定的异常

    try
    {

        // 可能抛出异常的代码。

        // throw 异常对象;

    }

    catch (exception1 e)
    {

        // 发生exception1异常时的处理代码。

    }

    catch (exception2 e)
    {

       // 发生exception2异常时的处理代码。

    }

try语句块中,如果没有发生异常,执行完try语句块中的代码后,将继续执行try语句块之后的代码;如果发生了异常,用throw抛出异常对象,异常对象的类型决定了应该匹配到哪个catch语句块,如果没有匹配到catch语句块,程序将调用abort()函数中止。

如果try语句块中用throw抛出异常对象,并且匹配到了catch语句块,执行完catch语句块中的代码后,将继续执行catch语句块之后的代码,不会回到try语句块中。

如果程序中的异常没有被捕获,程序将异常中止。

二、栈解旋

异常被抛出后,从进入try语句块开始,到异常被抛出之前,这期间在上构造的所有对象,都会被自动析构。析构的顺序与构造的顺序相反。这一过程称为栈的解旋。

也就是在执行throw前,在try执行期间构造的所有对象被自动析构后,才会进入catch匹配。

#include <iostream>
#include <string>
using namespace std;
//C++异常
// 如果程序中抛出的异常没有被捕获,程序将异常中止
//

int main()
{
	while (true) {

		int ii = 0;
			try
			{
				//可能抛出异常的代码;
				cout << "你是一只什么鸟:";
				cin >> ii;

				if (ii == 1) throw "有人说我是月月鸟";
				if (ii == 2) throw ii;
				if (ii == 3)throw string("有人说我是光军");
			}
			catch (int ii)
			{
				cout << "异常的类型是int=" << ii << endl;
			}
			catch (const char* ss)
			{
				cout << "异常的类型是const char*=" << ss << endl;
			}
			catch (string str)
			{
				cout << "异常的类型是string=" << str << endl;
			}

			if (ii == 0) break;

			cout << "程序继续运行" << endl<<endl;
	}

	return 0;

}

三、重点关注的异常

1)std::bad_alloc

如果内存不足,调用new会产生异常,导致程序中止;如果在new关键字后面加(std::nothrow)选项,则返回nullptr,不会产生异常。

#include <iostream>
using namespace std;

int main()
{
	try {
		// 如果分配内存失败,会抛出异常。
		//double* ptr = new double[100000000000];  
		// 如果分配内存失败,将返回nullptr,会抛出异常。
		double* ptr = new (std::nothrow) double[100000000000];  

		if (ptr == nullptr) cout << "ptr is null.\n";
	}
	catch (bad_alloc& e)
	{
		cout << "catch bad_alloc.\n";
	}
}

2)std::bad_cast

dynamic_cast可以用于引用,但是,C++没有与空指针对应的引用值,如果转换请求不正确,会出现std::bad_cast异常。

dynamic_cast 是 C++ 里专门用来在继承层次中进行安全类型转换的运算符,主要用在多态(带虚函数)的类之间,把基类指针/引用转换为派生类指针/引用

转换时会在运行时检查类型是否匹配(RTTI: Run-Time Type Information)。

如果不匹配,指针版本会返回 nullptr,引用版本会抛 std::bad_cast 异常。

3)std::bad_typeid

假设有表达式typeid(*ptr),当ptr是空指针时,如果ptr是多态的类型,将引发std::bad_typeid异常。

typeid 是 C++ 运行时类型识别(RTTI, Run-Time Type Information)机制的一部分,用来在程序运行时获取一个表达式或类型的实际类型信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值