我的C++异常类真的需要多精益?

Car*_*org 11 c++ exception

有很多地方可以找到设计异常类的指南.几乎在我看的每个地方,都有异常对象永远不应该做的事情列表,这会影响这些类的设计.

例如,Boost人员建议该类不包含任何std::string成员,因为它们的构造函数可能会抛出,这会导致运行时立即终止程序.

现在,在我看来,这是相当理论化的.如果std::string构造函数抛出,那么它是一个bug(我传入了一个空指针)或一个内存不足的情况(如果我错了,请纠正我).由于我在桌面上,我只是假装我有无限的内存,无论如何,内存耗尽对我的应用程序来说是致命的.

考虑到这一点,为什么我不应该std::string在我的异常类中嵌入对象?事实上,为什么我的异常类不能全功能,并且还要处理日志记录,堆栈跟踪等.我知道一个责任原则,在我看来,这是一个公平的权衡让异常类完成所有这些.当然,如果我的解析器需要报告语法错误,那么功能齐全的异常将比围绕静态分配的字符数组构建的异常更有帮助.

那么:精益C++异常类 - 它在现实世界中有多大的优势?有什么权衡取舍?是否有关于该主题的良好讨论?

fbo*_*net 2

一般情况下,异常类应该是简单的、自给自足的结构,并且从不分配内存(就像std::string这样做的那样)。第一个原因是分配或其他复杂操作可能会失败或产生副作用。另一个原因是异常对象是按值传递的,因此是堆栈分配的,因此它们必须尽可能轻量级。更高级别的功能应由客户端代码处理,而不是异常类本身(除非出于调试目的)。