抛出(或相应地)NULL函数参数而不是让它全部爆炸?

Joh*_*ell 6 c c++ validation error-handling exception-handling

在以前需要高耐用性和长期向上的时间,我一直是大规模应用验证指针函数的参数,当它被记录为"绝不能为空".std::invalid_argument如果参数在C++中实际为NULL并且在C中返回错误代码,那么我会抛出异常或类似的异常.

但是,我开始认为也许最好让应用程序立即在同一个函数中的第一个NULL指针取消引用中爆炸 - 然后崩溃转储文件将揭示发生了什么 - 并让一个彻底的测试过程发现坏的函数调用.

检查NULL并让应用程序爆炸的一个问题是,如果指针实际上没有在该函数中解除引用,而是存储以供以后使用,那么解除引用爆炸将脱离上下文并且更难以诊断.

有关于此的任何想法或最佳做法?

编辑1:我忘了提到我们的许多代码都是第三方开发人员的库,可能会或可能不知道我们的内部错误处理策略.但功能仍然正确记录!

小智 10

我个人的偏好是记录这个函数不能采用NULL指针的事实,并保留它.请注意,虽然无法保证解除引用NULL指针会导致崩溃 - 如果您坚持诊断,抛出异常是唯一的可移植解决方案.

话虽如此,我发现在我自己的代码中,不需要的NULL指针非常非常罕见.如果你有很多这样的话,它会在其他地方提出问题,可能是在代码的基本设计中.


sha*_*oth 5

肯定会抛出一个C++异常 - 它可以比以后的程序更容易记录和诊断.

在以下情况下考虑自己.你的程序工作了十天,然后面对那个空指针.如果它在第11天爆炸,你将不得不弄清楚问题与前一天的那个空指针有关.但是,如果您抛出异常并记录其文本,您可以查看日志广告从那里开始工作.换句话说,您将确定问题是空指针.试想一下程序在客户站点时的差异,而不是在舒适的调试环境中.


Han*_*ant 1

这是一个简单的电话。在没有预期的情况下获得 NULL 指针是程序中存在错误或严重受损的程序状态的明显标志。任何一个都需要程序员做一些事情。只有当异常没有被捕获时,抛出异常才会有很好的效果。如果被发现,您会丢失非常重要的诊断信息,它会丢弃最重要的调用堆栈,帮助您找出它是如何进入该状态的。如果它没有被捕获,那么 C++ 异常和硬件异常之间没有明显的区别。

异常可能在某个地方被捕获的风险要求您不要抛出异常并让它消亡。

对于可以在捕获异常后生成调用堆栈的运行时环境,这种考虑是非常不同的。常见于托管环境,而不是本机 C/C++。