从函数返回错误的最佳做法是什么?

时间:2009-01-24 16:09:55

标签: .net error-handling

当我需要从函数返回错误消息时,我通常会执行类似下面示例的操作,如果没有错误发生,我只返回一个empyty字符串。这是最佳实践,还是有替代方法从函数返回错误消息?

Function Test() as String
  ' Do something
  If error occured Then   
    Return "Some error message"
  Else   
    Return ""    
End Functon

5 个答案:

答案 0 :(得分:9)

您应该抛出包含错误消息的异常,而不是返回错误消息。

以下是快速概述:http://www.vbdotnetheaven.com/UploadFile/rajeshvs/dotnetException04162005022135AM/dotnetException.aspx

答案 1 :(得分:6)

Exception Handling是处理错误的首选方法。使用您的函数的开发人员可能会忽略错误代码返回值。例外迫使他们注意到。这绝对值得学习。

当你在你的问题中编写代码时,你可能会认为它会被这样调用:

String message = Test();
// process the message for errors.

很多开发人员只会绕过处理邮件,甚至可以像这样调用你的函数:

Test();
// go about your business, happily ignoring the error message

如果您的代码抛出异常,则不能忽略它。开发人员必须至少承认通过在函数调用周围放置一个try块来抛出异常。在那时,他们被迫用它做某事

答案 2 :(得分:4)

正如Erik和Bill所说,异常是在.NET中传播错误的常规方式。但是,有些情况下它们不合适 - 例如验证用户输入。那时候有几种选择:

  • 使用错误代码(例如枚举)来指示错误类型。例如,您可能有一个代码为“密码太短”而另一个代码为“密码不包含任何数字”等。

  • 按照您在问题中建议的方式使用错误消息。我个人会使用一个空引用来表示“它还可以”,或者可能使该方法返回一个布尔值(有效/无效),并为错误消息提供一个out参数。使用字符串对国际化来说很糟糕,但在许多方面比较简单(避免额外查找,更容易添加新类型的错误等),而不是错误代码版本。对于一个永远不需要国际化的内部应用程序来说,这可能会很好。

我强调这些是选项,其中异常没有意义 - 否则,异常是可行的方法。

答案 3 :(得分:1)

请求 - 响应模式可以帮助处理错误以及可能失败的许多方法。例如,在信用卡身份验证过程中,您可能有:

class CreditCardAuthenticationRequest {
    string CreditCardNumber;
    string FullName;
    ...
}

class CreditCardAuthenticationResponse {
    CreditProcessorStatusCode Status;
    CreditProcessorWarnings[] Warnings;
    CreditProcessorErrors[] Errors;
    Exception Exception;
    ...
}

现在突然你所有的错误处理和验证都可以包含在一个整洁的小包中。来自DoFactory.com的Patterns in Action sample application广泛使用它。

答案 4 :(得分:0)

我同意,一般情况下,当方法不会返回值时,您会希望使用异常来处理错误。但是,如果该方法确实返回了值,则可以在某些情况下使用返回值。例如,如果您尝试从键控集合中检索对象并且该键不存在,则返回null作为不存在的证据而不是抛出异常是完全合理的。但是,你的情况似乎不符合这种情况,我会选择例外。