当我需要从函数返回错误消息时,我通常会执行类似下面示例的操作,如果没有错误发生,我只返回一个empyty字符串。这是最佳实践,还是有替代方法从函数返回错误消息?
Function Test() as String
' Do something
If error occured Then
Return "Some error message"
Else
Return ""
End Functon
答案 0 :(得分:9)
您应该抛出包含错误消息的异常,而不是返回错误消息。
答案 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作为不存在的证据而不是抛出异常是完全合理的。但是,你的情况似乎不符合这种情况,我会选择例外。