我曾经在两个阵营中听到(并重复)C++异常的口号。已经过了一段时间,我只是想再次把自己聚焦,这个讨论是 特定于我所链接的代码(或像容器这样的低级类),以及它们的依赖项。我曾经是一个采用防御性和错误代码的C程序员,但这是一种繁琐的做法,现在我正在更高层次的抽象中进行编程。
因此,我正在重写一个容器类(以及它的依赖项),使其更加灵活和易读(迭代器目前不存在)。正如您所看到的,在我知道将在调用站点测试它们的情况下,我返回枚举错误代码。这些容器用于运行时构建AST,初始化并使其只读。异常存在是为了防止容器被天真地使用(可能是我未来的自己)。
在这个类中,我到处都有异常,它们让我感到不舒服。我欣赏它们的用例。如果我有选择,我可能会完全关闭它们(Boost经常使用异常,我正在构建Boost,是的,我知道它们可以被禁用,但在罗马时......)。我有将它们替换为错误代码的选择,但是嘿,我不会测试它们,那么有什么意义呢?
我应该用ASSERTS替换它们吗?人们所说的这种膨胀是什么[1] [2] [3]?每个函数调用站点都会得到额外的机器吗?还是只有那些有catch子句的函数调用站点?既然我不会捕获这些异常,那么我不应该成为这种膨胀的受害者,对吧?ASSERTS不会进入发布版本,在基本原始类(即容器)的上下文中,这是否重要?我的意思是逻辑错误会以多大的几率进入最终构建中?
由于我们喜欢回答专注的问题,以下是我的问题:你会怎么做,为什么? :D
无关链接:错误代码和它们在异常中的附带作用。
编辑2:在这种情况下,选择是ASSERTS和异常之间的选择,我认为异常是最有意义的,正如我上面提到的,容器在初始化后是只读的,大多数异常都在初始化期间触发。