C++何时处理异常
C++ When to handle an exception
如果您有这样的函数调用,哪个级别最适合处理我的throw?我只想弹出一条错误消息。
class Test {
void A() {
B();
// try and catch here ?
}
void B() {
C();
// try and catch here ?
}
void C() {
throw 1;
}
}
int main()
{
Test test;
test.A();
// try and catch here ?
return 0;
}
何时决定处理异常在很大程度上取决于设计模式和特定场景,但通常情况下,您希望在能够可靠处理异常时尽快处理异常。
如果没有足够的信息来处理异常,则应该在调用堆栈上抛出更高的异常。原因如下:
- 异常比检查错误处理的返回类型更昂贵
- 如果你一直在调用堆栈中抛出异常,那么很多代码将无法运行(或者至少你必须编写很多混乱的finally块)
- 调用堆栈中的高级函数将承担捕获许多不同类型异常的负担,这会妨碍它们的预期工作
相反,如果您能尽早可靠地发现并处理异常:
-
调用堆栈上比catch块更高的函数甚至不知道发生了异常
-
通过避免过度抛出异常,您将获得性能提升
-
通常是为了分离关注点而进行的更好的设计。
好吧,这取决于您的实际用例。
如果你只是想弹出一条错误消息并终止你的程序,你根本不应该捕捉到任何东西。
默认的std::terminate处理程序已经完成了此操作。
如果你只是想显示一条错误消息,并继续进行构建,你应该从能够克服错误并能够安全地继续程序运行状态的级别开始。
相关文章:
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Firebase C++VS2018 SDL2-在Firebase::app::create(..)上执行异常处理
- 使用 stoi 功能进行异常处理
- 子系统中的异常处理:本机
- 与异常处理程序中的操作员<<不匹配
- 数组 C++ 上的异常处理程序
- 异常处理:如果用户输入不是三个特定字符之一
- C++ 异常处理错误输出
- 视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc
- C++交换机状态异常处理
- 在字符串类上的成员函数和out_of_range异常处理
- 奇怪的消息 (_Base_bitset::_M_do_to_ulong) 从溢出异常处理程序中打印出来
- 执行视觉工作室异常处理模式
- 为什么隐式转换在异常处理中从派生到基?
- C++执行期间的类成员函数错误/异常处理
- C++ 中未处理的异常处理程序
- 用户定义的异常处理
- C :ScopeGuard vs返回支票和异常处理
- 异常处理期间的类型解析