跳转到主内容
极星编程网:以代码为星,赴技术山海!

C++如何处理异常?(try-catch用法详解)

C++异常处理通过try、catch、throw实现,用于应对不可预测但可恢复的错误;try块必须后跟至少一个catch块,catch按异常类型匹配捕获,未捕获则调用std::terminate终止程序。 在C++中,异常处理主要通过 try 、 catch 和 throw 三个关键字配合实现。它不是用来替代常规错误检查(比如判断指针是否为空),而是应对程序运行中**不可预测、非常规但可恢复的错误场景**,比如内存分配失败、文件打开失败、数组越界访问(需手动检查)等。 基本语法结构:try-catch捕获异常 核心结构是把可能出问题的代码放在 try 块中,用一个或多个 catch 块来接收并处理抛出的异常: try 块必须紧跟至少一个 catch ,不能单独存在; catch 后面的括号里写的是**异常类型**(可以是内置类型如
int
、
const char*
,也可以是自定义类),支持类型匹配和自动类型转换(有限制); 一旦 try 中某处执行了 throw ,程序立即跳出当前函数调用栈,逐层向上寻找匹配的 catch ;没找到就终止程序(调用
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++标准库提供了
中的一系列异常类(如
std::invalid_argument
、
std::out_of_range
、
std::logic_error
、
std::runtime_error
等),它们都继承自
std::exception
,具备
what()
成员函数返回描述信息。 立即学习 “ C++免费学习笔记(深入) ”; C知道 CSDN推出的一款AI技术问答工具 下载 比
throw 42
或
throw "error"
更安全、更语义清晰; 便于统一捕获基类(如
catch(const std::exception&)
),也支持多级细化处理; 避免因类型不匹配导致异常未被捕获(例如
throw "hello"
是
const char*
,用
catch(std::string)
就捕不到)。 throw 表达式:主动抛出异常 throw 后面可以是任意表达式,其类型就是该异常的类型:
throw 123;
→ 抛出
int
类型异常;
throw std::logic_error("参数非法");
→ 抛出临时对象;
throw;
(不带表达式)只能出现在 catch 块中,表示**重新抛出当前正在处理的异常**,常用于日志记录后继续上抛。 注意:不要抛出局部对象的引用或指针(会悬空),优先抛值或 const 引用。 异常规范与 noexcept(现代 C++ 推荐) C++11 起,用 noexcept 替代旧的异常说明符(如
throw()
):
void func() noexcept;
表示承诺绝不抛出异常;若违反,调用
std::terminate
;
void func() noexcept(true);
等价于上面写法;
noexcept(false)
表示可能抛出; 编译器可据此优化(如移动构造函数是否调用),且标准容器对
noexcept
移动操作有特殊要求。 不建议为每个函数加
noexcept
,只在明确不抛异常且有性能/正确性需求时使用(如析构函数、移动操作、swap 等)。

相关文章