C++ 异常处理机制详解
一、异常的概念及使用
1. 异常的概念
异常处理机制允许程序中独立开发的部分在运行时遇到问题时进行通信并做出相应处理。它将问题的检测与解决过程分离,一部分负责检测问题,另一部分负责解决,检测环节无需知晓处理模块的所有细节。
C 语言主要通过错误码处理错误,本质是对错误信息进行分类编号,拿到错误码后还需查询具体信息,比较繁琐。而 C++ 异常抛出一个对象,该对象可包含更全面的各类信息。
2. 异常的抛出和捕获
程序出现问题时,我们通过 throw 一个对象来引发异常。该对象的类型及当前调用链决定了由哪个 catch 代码块来处理。
被选中的处理代码是调用链中与该对象类型匹配且离抛出位置最近的那一个。根据抛出对象的类型和内容,异常抛出部分告知处理部分发生了什么错误。
当 throw 执行时,其后的语句将不再被执行。程序从 throw 位置跳转到匹配的 catch 模块。控制权转移后有两个重要含义:
- 沿着调用链的函数可能提早退出。
- 一旦开始执行异常处理程序,沿着调用链创建的对象都将销毁。
抛出异常对象后,会生成一个拷贝(类似于函数传值返回),因为抛出的可能是局部对象。这个拷贝对象会在 catch 子句结束后销毁。
#include <iostream>
#include <string>
void doubleDivide(int a, int b) {
try {
// 当 b == 0 时抛出异常
if (b == 0) {
throw "Divide by zero condition!";
} else {
return ((double)a / (double)b);
}
} catch (const char* msg) {
std::cout << msg << std::endl;
}
return 0;
}
void Func() {
int len, time;
std::cin >> len >> time;
try {
std::cout << (len, time) << std::endl;
} ( * errmsg) {
std::cout << errmsg << std::endl;
}
std::cout << __func__ << << __LINE__ << << std::endl;
}
{
() {
{
();
} ( std::string& errmsg) {
std::cout << errmsg << std::endl;
}
}
;
}


