16 August 2023

C++ 核心指南目录

“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 就永远不会被调用。

强化

标记所有会导致覆盖后续异常的异常处理。