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)机制的一部分,用来在程序运行时获取一个表达式或类型的实际类型信息。
2038

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



