Has*_*yed 6 c++ exception assertions
我已经听到(和反刍)围栏两侧的C++异常口头禅.它已经有一段时间了,我只想再次集中自己,这个讨论特定于我链接的代码(或容器等低级类),以及它的依赖关系.我曾经是一个使用C程序员的防御和错误代码,但这是一个令人厌倦的实践,我现在编程的更高层次的抽象.
所以我重写一个容器类(和它的依赖项)更灵活,读取更好(迭代器没有atm).正如您所看到的,我将返回枚举的error_codes,我知道我将在调用站点测试它们.容器用于AST的运行时构建,初始化和只读.它们的例外是防止容器被天真地使用(将来可能由我自己使用).
我在这堂课的所有地方都有例外,他们让我觉得很脏.我很感激他们的用例.如果我有选择,我可能会完全关闭它们(Boost使用了很多例外,我正在建立Boost,是的,我知道他们可以被禁用,但是在罗马时......).我可以选择用error_codes替换它们但是嘿,我不会测试它们,那么重点是什么?
我应该用ASSERTS替换它们吗?[1] [2] [3]这个膨胀的人是什么?每个函数调用点都能获得额外的机器吗?或者只有那些有捕获条款的人?既然我不会抓住这些例外,我不应该成为这种膨胀的受害者吗?ASSERTS不会进入发布版本,在基本原始类(即容器)的上下文中,这甚至不重要吗?我的意思是逻辑错误进入最终构建的可能性有多高?
既然我们想回答有针对性的问题,那么这就是我的:你会做什么,为什么?:d
不相关的链接:错误代码并让他们在异常中备份.
编辑2在这种特殊情况下选择在ASSERT和异常之间,我认为异常是最有意义的,正如我上面提到的,容器只在初始化后被读取,并且大多数异常在初始化期间被触发.
Cat*_*lus 13
这很简单.避免使用像fire这样的错误代码并选择异常,除非错误代码在个别情况下更有意义.为什么?因为异常可以携带更多信息 - 例如,参见Boost.Exception.因为他们自动传播,所以你不能做的错误不检查错误条件.因为有时候,你必须(拯救一个构造函数),所以为什么不一致.C++根本没有提供任何更好的方式来发送错误信号.
另一方面,断言用于完全不同的东西 - 验证代码的内部状态,以及应该始终成立的假设.断言失败总是一个错误 - 例如,异常可能表示无效的外部输入.
至于链接指南:忘记谷歌风格指南甚至存在,它只是可怕,这不仅仅是我的意见.LLVM - 可执行的大小几乎不重要,它不是你应该浪费时间思考的东西.Qt - Qt缺乏异常安全性,但这并不意味着您的代码也必须如此.使用现代实践,保护异常不应该太难.