.net 是否应该捕获空引用?

.net 是否应该捕获空引用?,.net,exception,nullreferenceexception,.net,Exception,Nullreferenceexception,我最近向一位同事表示: NullReferenceExceptions永远不应该出现 被抓住 我用了“从不”这个词。。。。嗯,我自己从来没有见过合适的捕捉它们的用例,但我想看看是否有其他人见过 毕竟,从来都不是一个强有力的词….好吧,当你调用一个有缺陷的第三方库时,如果你知道如何正确处理它们,那么捕获它们可能是一个好主意 现实生活中的例子: 在过去,我广泛使用了由第三方编辑器提供的datagrid。 他们已经(或者现在已经)确认了一个bug,当更新底层数据源中的一些数据时,该bug会不时抛出一个

我最近向一位同事表示:

NullReferenceExceptions永远不应该出现 被抓住

我用了“从不”这个词。。。。嗯,我自己从来没有见过合适的捕捉它们的用例,但我想看看是否有其他人见过


毕竟,从来都不是一个强有力的词….

好吧,当你调用一个有缺陷的第三方库时,如果你知道如何正确处理它们,那么捕获它们可能是一个好主意

现实生活中的例子: 在过去,我广泛使用了由第三方编辑器提供的datagrid。 他们已经(或者现在已经)确认了一个bug,当更新底层数据源中的一些数据时,该bug会不时抛出一个nullref(嵌套在调用堆栈的深处)

我已经用这个代码处理了这种情况:

            try
            {
                // do the update
            }
            catch (NullReferenceException)
            {
                try
                {
                    // redo the update
                }
                catch (NullReferenceException ex)
                {
                    // properly log the third party lib failure
                }
            }
顺便说一句,我的“日志”代码两年来从未执行过:)
现在第三方编辑器已经解决了这个问题,我可能应该删除这段代码。

这取决于原因;看埃里克·利珀特的。
如果它们是“boneheaded异常”,那么不,只需修复调用代码即可。在极少数情况下,它们是“令人烦恼的异常”(即,您正在调用的代码具有难以避免的陷阱),那么我想您必须这样做。

我不会说永远不会。例如,您可以捕获它来记录异常或将其从一个线程封送到另一个线程。在这两种情况下,都应该再次抛出异常


正如马克·格雷威尔指出的那样,埃里克·利珀特在他的博客上有一篇关于例外情况的非常好的文章

也许正确的引语是

NullReferenceExceptions永远不应该出现 如果您拥有 引发异常的代码


我曾经不得不根据大约15个变量的值构建一个大字符串。我没有检查每一个是否为空,而是继续创建字符串,取消对变量的引用,并捕获NRE。老实说,它让我感觉很糟糕和淘气,但它让我免于编写大量代码。

你说得对,“从不”是一个强有力的词

捕获NullReferenceException(或Java的NPE)始终取决于代码的用途

例如,如果您的应用程序要求处理继续进行,即使状态可能不确定(想想生命支持系统),或者如果您的代码不关心被引用对象的状态(例如:批处理数据,逐字逐句地抛出坏数据)


不捕捉这些类型的异常是一条很好的经验法则,但不是一条法则。

oOo现在这是一个比我更好的总结。是的,但在这种情况下,你将捕捉异常,而不是显式捕捉NullReferenceException。我刚刚再次阅读你的帖子时注意到“显式”。考虑到我倾向于使用“从不”或至少是“从不”,除非你有很好的理由并且确切地知道你在做什么”。是的,但在这些情况下,你会捕获基本异常类型,而不是一个明确的NullReferenceException(为我的迂腐行为道歉)。好吧,但还是捕获了…:)感谢伟大的文章链接