CppCoreGuidelines E.31 妥善编排 catch 语句的顺序
16 August 2023
“Properly order your catch-clauses”
理由
catch
语句是顺序执行的,前一个语句可能会覆盖后一个语句。
错误例子
void f() { // ... try { // ... } catch (Base& b) { /* ... */ } catch (Derived& d) { /* ... */ } catch (...) { /* ... */ } catch (std::exception& e) { /* ... */ } }
如果 Derive
是从 Base
派生的,那么就无法调用 Derive
的处理过程。还有
...
表示捕获所有例外,这样的话,后面的 std::exception
就永远不会被调用。
强化
标记所有会导致覆盖后续异常的异常处理。