Joh*_*ell 6 c c++ validation error-handling exception-handling
在以前需要高耐用性和长期向上的时间,我一直是大规模应用的验证指针函数的参数,当它被记录为"绝不能为空".std::invalid_argument如果参数在C++中实际为NULL并且在C中返回错误代码,那么我会抛出异常或类似的异常.
但是,我开始认为也许最好让应用程序立即在同一个函数中的第一个NULL指针取消引用中爆炸 - 然后崩溃转储文件将揭示发生了什么 - 并让一个彻底的测试过程发现坏的函数调用.
不检查NULL并让应用程序爆炸的一个问题是,如果指针实际上没有在该函数中解除引用,而是存储以供以后使用,那么解除引用爆炸将脱离上下文并且更难以诊断.
有关于此的任何想法或最佳做法?
编辑1:我忘了提到我们的许多代码都是第三方开发人员的库,可能会或可能不知道我们的内部错误处理策略.但功能仍然正确记录!
小智 10
我个人的偏好是记录这个函数不能采用NULL指针的事实,并保留它.请注意,虽然无法保证解除引用NULL指针会导致崩溃 - 如果您坚持诊断,抛出异常是唯一的可移植解决方案.
话虽如此,我发现在我自己的代码中,不需要的NULL指针非常非常罕见.如果你有很多这样的话,它会在其他地方提出问题,可能是在代码的基本设计中.
肯定会抛出一个C++异常 - 它可以比以后的程序更容易记录和诊断.
在以下情况下考虑自己.你的程序工作了十天,然后面对那个空指针.如果它在第11天爆炸,你将不得不弄清楚问题与前一天的那个空指针有关.但是,如果您抛出异常并记录其文本,您可以查看日志广告从那里开始工作.换句话说,您将确定问题是空指针.试想一下程序在客户站点时的差异,而不是在舒适的调试环境中.
这是一个简单的电话。在没有预期的情况下获得 NULL 指针是程序中存在错误或严重受损的程序状态的明显标志。任何一个都需要程序员做一些事情。只有当异常没有被捕获时,抛出异常才会有很好的效果。如果被发现,您会丢失非常重要的诊断信息,它会丢弃最重要的调用堆栈,帮助您找出它是如何进入该状态的。如果它没有被捕获,那么 C++ 异常和硬件异常之间没有明显的区别。
异常可能在某个地方被捕获的风险要求您不要抛出异常并让它消亡。
对于可以在捕获异常后生成调用堆栈的运行时环境,这种考虑是非常不同的。常见于托管环境,而不是本机 C/C++。
| 归档时间: |
|
| 查看次数: |
486 次 |
| 最近记录: |