是否检查null

Pos*_*Guy 11 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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

或应该是

if (refundResponse == null)
                return null;
Run Code Online (Sandbox Code Playgroud)

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

 refundTransactionID = refundResponse.RefundTransactionID;
Run Code Online (Sandbox Code Playgroud)

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

lep*_*pie 12

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


sle*_*ske 8

我知道你应该总是检查传入的params到null的方法.

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

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

  • 尽管如此,当一个不应该为"null"的参数接收到一个"null"值时,在.NET上抛出`ArgumentNullException`是常规的. (9认同)
  • @sleske:通常最好在方法的开头抛出一个`ArgumentNullException`,其中包含有关参数null的信息.如果您只是忽略了错误的输入并让代码稍后抛出一个`NullReferenceException`,那么在此之前您可能已经进行了几次内部调用.到那时,异常可能来自一些未记录的内部函数,参数名称可能与外部可见名称不同,因此对调用者没有直接意义. (3认同)