NullRefs应该被捕获吗?

时间:2009-02-25 10:31:10

标签: .net exception nullreferenceexception

我最近向一位同事发表了声明:

  

NullReferenceExceptions 永远不会   被明确抓住

我用了永远......嗯这个词。我自己从未见过适当的用例来抓住它们,但我想检查是否还有其他用户?

毕竟,从来没有这么强大的词......

6 个答案:

答案 0 :(得分:6)

这取决于原因;见Eric Lippert的blog entry。 如果它们是“愚蠢的例外”,那么不 - 只修复调用代码。在极少数情况下,它们是“令人烦恼的例外”(即您所调用的代码具有难以避免的陷阱),那么我猜您必须这样做。

答案 1 :(得分:4)

好吧,当你打电话给一个有问题的第三方库时,如果你知道如何正确处理它们,那么抓住它们可能是个好主意。

现实生活中的例子: 过去,我已经广泛使用了第三方编辑器提供的数据网格。 他们已经(或者此时)有一个确认的错误,当更新基础数据源中的某些数据时,会不时抛出一个nullref(嵌套在他们的调用堆栈中)。

我用这段代码处理了这个情况:

            try
            {
                // do the update
            }
            catch (NullReferenceException)
            {
                try
                {
                    // redo the update
                }
                catch (NullReferenceException ex)
                {
                    // properly log the third party lib failure
                }
            }

顺便说一句,我的“日志”代码从未在2年内执行过:) 现在,第三方编辑已修复此问题,我应该删除此代码。

答案 2 :(得分:4)

也许正确的引用是

  

永远不应该使用NullReferenceExceptions   明确抓住如果你拥有   抛出异常的代码

答案 3 :(得分:1)

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

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

例如,如果您的应用程序要求处理继续进行,即使存在潜在的不确定状态(请考虑生命支持系统),或者您的代码不关心引用对象的状态(例如:抛出的批处理数据,字面意思,糟糕的数据)。

不捕捉这些类型的例外是一个很好的经验法则,但不是法律。

答案 4 :(得分:0)

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

正如Marc Gravell所指出的,Eric Lippert在他的博客上有关于例外情况的非常好的参赛作品。

答案 5 :(得分:0)

我曾经不得不根据15个左右变量的值构建一个大字符串。我只是继续创建字符串,取消引用变量,然后捕获NRE,而不是检查每个值是否为null。说实话,它感觉很糟糕和顽皮,但它使我免于编写大量代码。