C++异常处理通过try、catch、throw实现,用于应对不可预测但可恢复的错误;try块必须后跟至少一个catch块,catch按异常类型匹配捕获,未捕获则调用std::terminate终止程序。

在C++中,异常处理主要通过 try、catch 和 throw 三个关键字配合实现。它不是用来替代常规错误检查(比如判断指针是否为空),而是应对程序运行中**不可预测、非常规但可恢复的错误场景**,比如内存分配失败、文件打开失败、数组越界访问(需手动检查)等。
核心结构是把可能出问题的代码放在 try 块中,用一个或多个 catch 块来接收并处理抛出的异常:
int、const char*,也可以是自定义类),支持类型匹配和自动类型转换(有限制);std::terminate)。示例:
try {
int* p = new int[1000000000]; // 可能抛出 std::bad_alloc
throw std::runtime_error("模拟运行时错误");
} catch (const std::runtime_error& e) {
std::cout << "捕获 runtime_error: " << e.what() << "\n";
} catch (const std::exception& e) {
std::cout << "捕获其他标准异常: " << e.what() << "\n";
} catch (...) {
std::cout << "捕获所有其他类型的异常(慎用)\n";
}C++标准库提供了 <stdexcept></stdexcept> 中的一系列异常类(如 std::invalid_argument、std::out_of_range、std::logic_error、std::runtime_error 等),它们都继承自 std::exception,具备 what() 成员函数返回描述信息。
立即学习“C++免费学习笔记(深入)”;
throw 42 或 throw "error" 更安全、更语义清晰;catch(const std::exception&)),也支持多级细化处理;throw "hello" 是 const char*,用 catch(std::string) 就捕不到)。throw 后面可以是任意表达式,其类型就是该异常的类型:
throw 123; → 抛出 int 类型异常;throw std::logic_error("参数非法"); → 抛出临时对象;throw;(不带表达式)只能出现在 catch 块中,表示**重新抛出当前正在处理的异常**,常用于日志记录后继续上抛。注意:不要抛出局部对象的引用或指针(会悬空),优先抛值或 const 引用。
C++11 起,用 noexcept 替代旧的异常说明符(如 throw()):
void func() noexcept; 表示承诺绝不抛出异常;若违反,调用 std::terminate;void func() noexcept(true); 等价于上面写法;noexcept(false) 表示可能抛出;noexcept 移动操作有特殊要求。不建议为每个函数加 noexcept,只在明确不抛异常且有性能/正确性需求时使用(如析构函数、移动操作、swap 等)。
以上就是C++如何处理异常?(try-catch用法详解)的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号