发布于2026-07-12 阅读(0)
扫一扫,手机访问
在C++里,异常处理是保障程序健壮性的关键手段,主要通过 try、catch 和 throw 三个关键字来实现。这套机制允许我们在运行时捕获并处理错误,而不是直接让程序崩溃。下面就来聊聊它的基本概念和常见用法。

一个最简单的例子:在 try 块中抛出异常,然后在 catch 块中捕获并处理它。注意,catch (...) 可以捕获所有类型的异常,但通常建议尽量指定具体类型。
#include
#include
int main() {
try {
// 可能抛出异常的代码
throw std::runtime_error("An error occurred");
} catch (const std::runtime_error& e) {
// 捕获并处理std::runtime_error类型的异常
std::cerr << "Caught exception: " << e.what() << std::endl;
} catch (...) {
// 捕获所有其他类型的异常
std::cerr << "Caught an unknown exception" << std::endl;
}
return 0;
}
实际开发中,不同异常往往需要不同处理逻辑。你可以为不同类型的异常分别提供 catch 块,编译器会从上到下匹配,找到第一个匹配的块执行。
try {
// 可能抛出异常的代码
throw std::runtime_error("An error occurred");
} catch (const std::runtime_error& e) {
std::cerr << "Caught runtime_error: " << e.what() << std::endl;
} catch (const std::logic_error& e) {
std::cerr << "Caught logic_error: " << e.what() << std::endl;
} catch (...) {
std::cerr << "Caught an unknown exception" << std::endl;
}
使用 throw 关键字可以随时主动抛出异常,比如在检测到非法参数时。下面的 divide 函数在被零除时抛出 runtime_error,由调用方通过 try-catch 处理。
void divide(int a, int b) {
if (b == 0) {
throw std::runtime_error("Division by zero");
}
return a / b;
}
int main() {
try {
divide(10, 0);
} catch (const std::runtime_error& e) {
std::cerr << "Caught exception: " << e.what() << std::endl;
}
return 0;
}
在C++11之前,异常规范(如 throw())曾被用来声明函数可能抛出的异常类型,但后来发现这套机制在实践中并不好用,于是C++11将其弃用,C++17直接移除。推荐使用 noexcept 关键字明确指定函数是否会抛出异常:
void divide(int a, int b) noexcept(false) {
if (b == 0) {
throw std::runtime_error("Division by zero");
}
return a / b;
}
这里 noexcept(false) 表示该函数可能抛出异常,而 noexcept(true) 则表示绝对不会抛出。
合理运用C++的异常处理机制,能让程序在面对意外情况时更从容,整体健壮性和可维护性也会明显提升。当然,没有银弹——具体场景需要仔细权衡,但掌握这套工具,绝对是值得的。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8