问题描述
我正在尝试遵循Cpp核心准则,并在适当的地方使用GSL。特别是,我想将Expects
和Ensures
用于前置条件和后置条件,以及span
和narrow_cast
,但错误处理并不可靠且不提供任何诊断。遇到错误时,GSL会简单地调用terminate
,使测试人员不了解导致终止的原因。
所以我的问题是:在出现错误的情况下,如何使用GSL并保持代码的健壮性?更简单地说,如何在终止之前使用GSL并获取错误诊断信息?
解决方法
我看不到实现这一目标的简便方法。您可以编写自己的终止处理程序,该处理程序将由std::terminate
调用,但是它与调用std::terminate
的位置和原因无关。取决于平台,可能有可能获得回溯并至少检索有关调用者的一些信息,但这并没有太大帮助。
对于MS / GSL,我在pull request中提供了一些代码,该代码丰富了narrow_cast
引发的异常,但是PR被拒绝了,因为它引入了流媒体库。 CppCoreGuidelines委员会成员Herb Sutter说:
C ++核心准则编辑者的电话:这似乎是在寻求调试帮助,而在发布模式下这可能会很昂贵。只能在调试模式下添加它,然后仅对不应该在调试和发布模式之间更改其依赖关系的项目添加(这似乎是不可取的,因为它限制了在此类项目中使用GSL)。最好是在引发异常时使用调试器查看信息,例如在
narrow
的实现中设置断点。
我的分支已删除,但如果您希望将该功能集成到代码中,则可以将其恢复。