try、catch、throw
使用异常处理错误
try、catch、throw 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
使用 throw 发出错误信号
throw 语句会引发异常,放弃当前执行路径,并沿调用栈向上寻找处理程序。
#include <iostream>
#include <stdexcept>
int main() {
try {
throw std::runtime_error("boom");
} catch (const std::exception& e) {
std::cout << e.what() << "\n";
}
}try 与 catch
可能抛出异常的代码放在 try 块中;匹配的处理程序则放在后续的 catch 块中。
#include <iostream>
#include <stdexcept>
int divide(int a, int b) {
if (b == 0) throw std::invalid_argument("divide by zero");
return a / b;
}
int main() {
try {
std::cout << divide(10, 0) << "\n";
} catch (const std::invalid_argument& e) {
std::cout << "error: " << e.what() << "\n";
}
}按 const 引用捕获
请始终通过 const& 捕获异常。按值捕获会切割派生异常,还会造成不必要的拷贝。
多个 catch 块
请按从最具体到最一般的顺序列出处理程序。第一个匹配的块会执行。
#include <iostream>
#include <stdexcept>
int main() {
try {
throw std::out_of_range("bad index");
} catch (const std::out_of_range& e) {
std::cout << "range: " << e.what() << "\n";
} catch (const std::exception& e) {
std::cout << "other: " << e.what() << "\n";
}
}栈展开
抛出异常时,调用栈会展开:从抛出点到处理程序之间的每个局部对象都会按相反顺序析构。
#include <iostream>
#include <stdexcept>
struct Trace {
~Trace() { std::cout << "unwound\n"; }
};
void f() {
Trace t;
throw std::runtime_error("x");
}
int main() {
try { f(); } catch (...) { std::cout << "caught\n"; }
}捕获所有异常的处理程序
catch (...) 块可以捕获任何异常类型。请谨慎使用它,通常用于记录日志后重新抛出异常。
重新抛出
在处理程序中,单独的 throw; 会重新抛出当前异常并保留其类型,以便外层处理程序处理它。
#include <iostream>
#include <stdexcept>
void inner() { throw std::runtime_error("deep"); }
void middle() {
try { inner(); }
catch (...) { std::cout << "logged\n"; throw; } // rethrow
}
int main() {
try { middle(); } catch (const std::exception& e) { std::cout << e.what() << "\n"; }
}标准异常层次结构
大多数标准异常都派生自 std::exception,该类型提供了 what()。捕获 std::exception 就可以处理它们全部。
按值抛出,按引用捕获
请按值抛出临时异常对象;运行时会将它们复制到安全区域。请按引用捕获,以避免切割。
异常与错误代码
异常会将错误路径与正常路径分开,并且无法像返回代码那样被悄无声息地忽略——但请只在确实属于异常情况时使用异常。
未捕获的异常会终止程序
如果没有处理程序匹配,系统就会调用 std::terminate,程序也会中止。请始终处理您预期可能发生的异常。
快速检查
请测试您对异常处理的理解。
回顾
您已经学习了如何使用 throw 引发错误,使用 try/catch 处理错误,以及栈展开如何沿途析构局部对象。请通过 const& 捕获异常,按从具体到一般的顺序排列处理程序,并使用单独的 throw; 重新抛出异常。
常见问题解答
「try、catch、throw」课时是免费的吗?
是的 — 「try、catch、throw」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「try、catch、throw」这节课中我会学到什么?
使用异常处理错误 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「try、catch、throw」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- try、catch、throw
- 异常安全
- noexcept 说明符
- 自定义异常类型