我最近向一位同事发表了声明:
NullReferenceExceptions 永远不会 被明确抓住
我用了永远......嗯这个词。我自己从未见过适当的用例来抓住它们,但我想检查是否还有其他用户?
毕竟,从来没有这么强大的词......
答案 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。说实话,它感觉很糟糕和顽皮,但它使我免于编写大量代码。