是否检查null

时间:2010-03-24 19:53:23

标签: c# error-handling

我知道你应该总是将传入的params检查为null的方法。但是,如果我有一个try / catch引用局部变量的情况怎么办?我真的需要在下面检查空吗?因为无论如何它都会捕获它,如果它为null并且下一行代码试图使用refundResponse变量:

    public string DoRefund(...)
    {
        try
        {
    ......
            string refundTransactionID = string.Empty;
    ......

            RefundTransactionResponseType refundResponse = transaction.DoRefund(...);

            if (refundResponse != null)
                refundTransactionID = refundResponse.RefundTransactionID;
    .....
        }
        catch (Exception ex)
        {
            LogError(ex);
            return ex.ToString();
        }
    }

请记住,我正在专门讨论局部变量并检查方法中的那些变量,而不是方法的传入参数。

我在这里要求的是我在设置refundTransactionID之前是否需要检查null或者我只是设置它而不假设编译器将处理并抛出如果它为null将被捕获并作为一个被抛回在这种情况下,字符串到调用者。

或应该是

if (refundResponse == null)
                return null;

或者只是完全检查这个局部变量赋值然后因为在这种情况下我有一个try / catch我正在处理编译器选择的任何异常,通过将异常作为字符串返回给调用者(这不是我决定寄回一个字符串,这是我老板的要求......所以现在绕过那个辩论):

 refundTransactionID = refundResponse.RefundTransactionID;

最终,该方法中的其他代码依赖于有效的refundTransactionID。

10 个答案:

答案 0 :(得分:12)

例外情况适用于特殊情况。如果您可以检查是否存在可持续错误,请执行此操作!

答案 1 :(得分:8)

  

我知道你应该经常检查   传入params到null的方法。

不,不一定。您应该指定的是方法的合同。指定您将为null参数抛出NullPointer / NullReferenceException是完全可以接受的(也是常见的)。然后你不需要任何检查。

您也可以检查null,但这只有在您能够有效处理空值时才有意义(例如,替换默认值)。

答案 2 :(得分:2)

您应该在该实例中检查null。您的应用程序逻辑应该能够处理这种情况,而无需例外。

答案 3 :(得分:2)

测试的替代方法是Null Object pattern。事务:: DoRefund()方法返回一个空对象,而不是返回Null或有效事务,该对象提供与RefundTransactionResponseType实例相同的接口,但其方法不执行任何操作。有了这个,就没有必要测试是否为Null。

应该明智地使用它,因为这可以很容易地隐藏问题。

答案 4 :(得分:1)

不,你不需要检查null。这开辟了另一个问题,但是,真的是否需要检查传入参数中的null?

记住:这是一种行为。你必须测试那种行为。

答案 5 :(得分:1)

但如果你不能继续这一点,就让异常宣传。

答案 6 :(得分:1)

不,看起来你不应该在这里检查null。而且我也不会检查所有传入参数的null(如您的描述所示)。

您将transactionID作为字符串或异常消息返回也很奇怪。如果发生异常,此方法的调用者将如何知道?

如果你真的想记录异常,那么如何:

    public string DoRefund(...) 
    { 
        try 
        {
            return transaction.DoRefund(...).RefundTransactionID; 
        } 
        catch (Exception ex) 
        { 
            LogError(ex); 
            throw ex;
        } 
    }

答案 7 :(得分:1)

您应检查null,而不是让异常处理处理它。正如leppie所说,例外是针对特殊情况而非正常的控制流程。如果你知道会发生什么问题,那么你应该优雅地处理它们。

要记住的另一件事是异常的性能影响。抛出异常时,JVM必须展开调用堆栈。在您的示例中,还会记录异常。所有这些都需要时间,而且比简单的“if”检查慢得多。

答案 8 :(得分:0)

我建议检查null然后进行某种软错误处理,而不是让它捕获并抛出错误消息。

答案 9 :(得分:0)

这取决于它对程序的意义(refundResponse == null)。如果这有一些意义,那么报告更多信息性错误是有意义的。如果它永远不会发生并且会在DoRefund方法中指出一个缺陷,那么我认为允许null稍后引发异常是好的。在后一种情况下,如果您对该方法持怀疑态度以及它是否符合预期,我只会进行特定的检查。