Exception 如何告知来电者故障原因

Exception 如何告知来电者故障原因,exception,methods,Exception,Methods,我有一个方法,它应该做一些事情,返回值是一个布尔值(成功/失败) 如果方法失败,则有几个原因会导致失败,调用者(用户界面层)可以使用这些原因向用户显示适当的消息(用户可以通过这种方式解决问题) 我想抛出带有适当消息的异常,但失败原因是正常执行路径的一部分(与方法成功相比,几乎有20%的几率发生)。所以例外是没有意义的 另一个选项是定义枚举并使用它通知调用方失败原因(使用Tuple作为返回类型或添加out参数)。我以前从未见过这种设计 将故障原因告知调用方的最佳做法是什么?对于20%的情况,使用异

我有一个方法,它应该做一些事情,返回值是一个布尔值(成功/失败)

如果方法失败,则有几个原因会导致失败,调用者(用户界面层)可以使用这些原因向用户显示适当的消息(用户可以通过这种方式解决问题)

我想抛出带有适当消息的异常,但失败原因是正常执行路径的一部分(与方法成功相比,几乎有20%的几率发生)。所以例外是没有意义的

另一个选项是定义枚举并使用它通知调用方失败原因(使用
Tuple
作为返回类型或添加
out
参数)。我以前从未见过这种设计


将故障原因告知调用方的最佳做法是什么?

对于20%的情况,使用异常协议并不丢脸,除非从性能角度来看,这是一个非常关键的路径。传入一个状态显示的数组是可行的,但它看起来很难看。

首先,确保用户确实想知道故障原因。有时候,最好只是说,“发生了不好的事情”。@John:我不同意。如果用户不在意,他们很容易忽略多余的信息。如果用户真的在意,任何未提供的信息将很难(如果不是不可能)获得。始终提供良好的错误报告。(请注意,“good”很可能意味着“只是说‘发生了一些不好的事情’,但也包括一个“more details”按钮”——这仍然要求调用方一直到GUI都知道失败的原因,即使它最终没有显示给用户。)@Dave:没有什么不同意的。我建议他确定用户是否需要这些信息。这并不等于说用户不需要它。@Dave:“良好的错误报告”是需要测试的,或者至少我希望您测试它。如果它不是必需的,那么为什么要编写它,为什么要测试它?@John:同意它需要测试,就像其他代码一样。至于需要,尽管。。。作为一个用户,我遇到了太多的代码,这些代码向您抛出不透明的错误消息,并且除了“发生了什么不好的事情”之外,我拒绝告诉任何事情,这使得我甚至无法确定是否可以修复问题,更不用说如何修复它了。这是非常令人沮丧和无用的。作为一名开发人员,如果我的用户打电话询问问题,我无法帮助他们,除非他们能提供足够的信息让我确定问题所在。无论如何,信息性错误报告总是需要的。我同意。如果返回值的布尔值已经有了意义,那么在返回类型中重载失败只会增加复杂性。@b参数:没有性能关键路径。我应该使用自定义异常(更容易捕获,需要执行更多的工作)还是只使用
系统的实例。异常
?@Xaqron:除非您的调用者捕获它们并根据异常类型采取不同的行为,否则决不要使用自定义异常。否则,
InvalidOperationException
或只是
Exception
就可以了。@John:所以调用方可以这样找到原因:
如果(例如Message.Contains(“某些字符串”)…
,检查异常字符串似乎不是一个好主意@Xaqron:检查邮件不是个好主意。您确实需要确定调用方的行为是否会根据您抛出的异常而有所不同。如果他们所要做的只是显示消息,那么您最好使用
invalidooperationexception
,也可以使用
MyCustomException