C++ 错误机制

备选方式

不看 outdated 的方式,只看 modern C++ 的错误处理方式主要是以下几种:

  • 异常 exception
  • std::expected<T, E> (since C++23 or with tl_expected)
  • assert/panic

使用情景

为了开销考虑,很有可能是无法 exclusively 选择其中一种的,需要按照错误发生的可能性进行特定选择。

错误机制 运行开销 使用情景
exception 错误路径动态分配 默认避免使用异常以防开销,非常肯定出错无法解决就 noexcept,如果抛出就 crash 则与 assert 无差别
std::expected Error 空间分配开销 错误路径可能性大且倾向于可解决,如 io 错误
assert/panic 非常肯定出错无法解决

推荐策略

在 modern c++ 可以避免使用 assertassert 可以作为逻辑检查的补充。

而在 exceptionstd::expected 的选择,可以顾名思义:

  • exception:意料之外的错误,无法解决,抛出并最好 crash。概率在 1% 下时可以考虑。
  • std::expected:意料之中的错误,可以解决,显式处理。错误路径概率不低。
最后更新于 Dec 12, 2024 19:26 +0800