在某些环境,例如游戏开发或嵌入式系统,C++ 异常被禁用或需要自定义的错误处理。根据文档 N2271 EASTL -- Electronic Arts 标准模板库,异常可能因以下几个原因而被禁用:
为了支持没有 C++ 异常支持的环境或具有特殊错误处理需求的环境,当定义了 BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS 或 BOOST_NO_EXCEPTIONS 时,Boost.Container 更改了错误信号行为。前者应由用户定义,后者可以由用户定义,也可以在编译器使用适当的标志(例如 GCC 中的 -fno-exceptions)调用时由 Boost.Confg 隐式定义。
当处理用户定义的类时,(例如,当构造用户定义的类时)
BOOST_NO_EXCEPTIONS,则库避免使用 try/catch/throw 语句。类编写者必须在内部处理和传播错误情况,因为没有错误会通过 Boost.Container 传播。BOOST_NO_EXCEPTIONS 未 定义,则库会传播异常,并提供文档中详细说明的异常保证。当库需要抛出异常时(例如,在 vector::at 中使用不正确的索引时抛出 out_of_range),库会调用在 boost/container/throw_exception.hpp 中声明的 throw-callback。
BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS,那么程序员必须为所有 throw_xxx 函数提供自己的定义。这些函数不能返回,它们必须抛出异常或调用 std::exit 或 std::abort。BOOST_NO_EXCEPTIONS,则会触发 BOOST_ASSERT_MSG 断言(有关更多信息,请参阅 Boost.Assert)。如果此断言返回,则调用 std::abort。std::out_of_range)。