使用bool(返回Type)来处理exception或将exception传递给客户端?

我试图找出处理exception的最佳方法,我的应用程序有很多层,并开始使用返回类型的BOOL,即如果失败则返回False,如果成功则返回True ..

这在SaveMyRecord(somerecord)等方法中效果很好; 因为我传递的值并且不需要任何返回,所以我可以使用bool的返回类型来指示它是否成功。

但后来它让我觉得像GetMyRecord()这样的东西实际上返回了IQueryable的类型,因此我不能用bool告诉我它是否失败。

事情是我处理很多我的错误,他们发生尝试和捕获,因此不希望客户端收到exception。

也许有更好的方法,然后我考虑使用OUT参数但这意味着我需要更改所有方法的签名并添加aditional params ..

也许我应该将exception传递回CLIENT并在那里处理它?

是否有一些标准或任何文档来提供最佳实践?

将exception冒泡到CLIENT并在那里处理它。 绝对将其全部细节传递给它。 大多数最佳实践几乎完全同意这一点,总是最终处理外围,在这种情况下是CLIENT,尽管在其他情况下可能是Web服务。

只有在您想要记录它, 添加更多信息或尝试从特定exception中恢复时才会捕获 。 在每种情况下,您将要么将原始内容作为内部抛出一个新exception,或者只是按原样“抛出”原始内容,并且如注释中所指出的那样不会“抛出”

这个问题几乎是重复的 ,你会发现很多关于SO的现有问题。 我昨天才回答了类似的问题

您应该开始阅读例外设计指南

然后,根据您的方案,您应该考虑其他因素,例如exception屏蔽。

例如:如果您使用Web服务(ASMX或WCF)作为后端,您可能需要查看改进Web服务安全性并阅读有关exception处理的部分。

如果方法无法完成它的工作,它应该抛出exception。 永远不要返回exception。

建议并被视为最佳实践的方法是使用例外。 您可以(并且应该)阅读框架设计指南(第2版) ,其中包含例外指南和try-parse模式。

使用返回码(数字或布尔值)有一些问题,最大的两个问题是:

  • 容易被程序员忽视/忽视。
  • 不能在所有情况下使用。 如果您的构造函数失败会发生什么? 您无法从构造函数中显式返回值。

至于何时处理exception,只有当你能对exception做一些有意义的事情时才应该处理它们。 始终处理exception以便客户端永远不会看到它们的问题是,您最终可能会处理一个您不应该拥有的exception并在以后导致更多问题(例如实际上丢失数据)。

这个问题很棒!

不要为exception编码。 在大多数情况下假装他们从未发生过。 我担心两个地方的exception:向用户显示错误反馈和资源管理(即抛出exception时关闭打开的文件)。

MS似乎喜欢的一种常见模式是使用返回’int’的ComputeSomething()方法,以及接受对整数的引用并返回Boolean的TryComputingSomething()方法。 后者在成功时将其计算存储在传入变量中并返回True; 如果因“预期”原因而失败,则返回False。 请注意,任一例程中的意外故障都可能引发exception。

在某些情况下,使用不同的模式可能会有所帮助,并且例程接受在遇到问题时调用的委托。 该委托可以返回exception,或者导致底层例程返回false,或者可能做其他事情。 请注意,在委托运行时,将提供可在捕获任何exception之前销毁的信息。 例如,如果一个例程应该从文件中读取行并将字符20-37转换为Date,那么如果出现解析错误,则记录整个输入行可能会有所帮助。 使用传入的委托,可以做到这一点; 如果没有这样的话,那就更难了。