C++异常处理是程序运行时处理错误情况的核心机制,通过try、catch、throw三个关键字配合,能够将错误处理逻辑和业务逻辑分离,让代码结构更清晰,也能更精准地定位和处理运行时出现的各类异常问题。

C++异常处理的核心关键字
C++异常处理依赖三个核心关键字,各自的作用如下:
- try:标记可能出现异常的代码块,程序会按顺序执行try块内的代码,一旦遇到异常就会跳转到对应的catch块。
- throw:用于抛出异常,可以抛出任意类型的异常值,包括基本类型、字符串、自定义对象等。
- catch:用于捕获和处理异常,需要指定要捕获的异常类型,匹配到对应类型的异常后就会执行处理逻辑。
基础异常处理语法示例
下面是一个简单的除零异常处理的示例,展示try-catch-throw的基本用法:
#include <iostream>
#include <stdexcept>
using namespace std;
// 除法函数,除数为0时抛出异常
double divide(double a, double b) {
if (b == 0) {
// 抛出运行时错误异常
throw runtime_error("除数不能为0");
}
return a / b;
}
int main() {
double num1 = 10.0, num2 = 0.0;
// try块包裹可能出现异常的代码
try {
double result = divide(num1, num2);
cout << "计算结果:" << result << endl;
}
// catch块捕获runtime_error类型的异常
catch (const runtime_error& e) {
cout << "捕获到异常:" << e.what() << endl;
}
// catch块捕获所有其他类型的异常
catch (...) {
cout << "捕获到未知类型的异常" << endl;
}
return 0;
}
上面的代码中,divide函数在除数为0时通过throw抛出了runtime_error类型的异常,main函数中的try块执行divide调用,触发异常后跳转到对应的catch块处理,避免了程序直接崩溃。
异常类型的匹配规则
catch块匹配异常时遵循以下规则:
- 异常类型严格匹配,抛出int类型异常只会匹配catch(int e)这样的块,不会自动转换为其他类型。
- 允许捕获父类类型的异常,比如抛出runtime_error的子类异常,可以被catch(const runtime_error& e)捕获。
- catch(...)可以捕获所有类型的异常,通常放在最后作为兜底处理,避免未捕获的异常导致程序终止。
自定义异常类
实际开发中可以根据需求自定义异常类,通常继承自标准异常基类std::exception,重写what()方法返回异常描述:
#include <iostream>
#include <exception>
#include <string>
using namespace std;
// 自定义异常类,继承自exception
class MyCustomException : public exception {
private:
string msg;
public:
MyCustomException(const string& message) : msg(message) {}
// 重写what方法,返回异常描述
const char* what() const noexcept override {
return msg.c_str();
}
};
void processData(int value) {
if (value < 0) {
throw MyCustomException("输入数据不能为负数");
}
cout << "处理数据:" << value << endl;
}
int main() {
try {
processData(-5);
} catch (const MyCustomException& e) {
cout << "自定义异常:" << e.what() << endl;
} catch (const exception& e) {
cout << "标准异常:" << e.what() << endl;
}
return 0;
}
异常处理最佳实践
编写C++异常处理代码时可以遵循以下实践,让程序更稳健:
- 不要抛出指针类型的异常,避免内存泄漏,优先抛出对象或者标准异常类型的实例。
- catch块尽量捕获具体的异常类型,少用catch(...),方便定位问题。
- 析构函数中不要抛出异常,否则可能导致程序终止,析构函数中的异常需要内部处理掉。
- 抛出的异常对象会被复制到catch块,因此自定义异常类最好实现正确的拷贝构造函数。
注意:C++的异常处理机制会带来一定的性能开销,因此在性能敏感的代码段中,不要将异常处理作为常规的控制流使用,只在真正的错误场景下抛出异常。
C++try-catch-throw异常处理错误捕获修改时间:2026-07-20 13:15:25