好的,我将为您详细解析 C++ 的异常处理机制,包括异常捕获、自定义异常与实战应用。
一、C++ 异常处理机制概述
C++ 异常处理通过 try、catch、throw 关键字实现:
- throw:抛出异常对象(如 throw MyException("error"))。
- try:定义可能抛出异常的代码块。
- catch:捕获并处理特定类型的异常。
try {
// 可能抛出异常的代码
if (error) throw std::runtime_error("Error occurred!");
} catch (const std::exception& e) {
std::cerr << "Caught exception: " << e.what() << std::endl;
}
二、异常捕获的层次化处理
通过多级 catch 块实现异常分类处理:
try {
// …
} catch (const FileIOException& e) {
// 处理文件 I/O 异常
} catch (const NetworkException& e) {
// 处理网络异常
} catch (…) {
// 捕获所有其他异常
}
三、自定义异常类
通过继承 std::exception 实现:
#include <stdexcept>
#include <string>
class MyException : public std::exception {
public:
explicit MyException(const std::string& msg) : message(msg) {}
const char* what() const noexcept override {
return message.c_str();
}
private:
std::string message;
};
// 使用示例
throw MyException("Custom error message");
四、实战应用:文件读取异常处理
#include <fstream>
#include <iostream>
#include <stdexcept>
void readFile(const std::string& filename) {
std::ifstream file(filename);
if (!file) {
throw std::runtime_error("Failed to open file: " + filename);
}
// 文件处理逻辑…
}
int main() {
try {
readFile("data.txt");
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << std::endl;
return 1;
}
return 0;
}
五、注意事项
资源泄漏预防
使用 RAII(如智能指针)确保异常发生时资源自动释放:
std::unique_ptr<Resource> res(new Resource());
异常安全等级
- 基本保证:对象处于有效状态。
- 强异常安全:操作要么完全成功,要么状态回滚。
- 不抛保证:函数声明 noexcept。
避免滥用
异常适用于非常规路径(如文件不存在),而非常规控制流。
六、总结
| 标准异常 | 内置错误类型(如 std::runtime_error) |
| 自定义异常 | 业务逻辑错误分类 |
| noexcept | 优化性能,声明无异常函数 |
通过合理使用异常处理,可提升代码健壮性与可维护性。
网硕互联帮助中心






评论前必须登录!
注册