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

mar*_*ith 5 .net c# exception-handling exception try-catch

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

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

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

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

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

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

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

dov*_*ove 10

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

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

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

  • 至于只捕获日志,只要你在记录后重新抛出异常,这也没关系.如果这样做,请确保只使用`throw`语句而不是`throw ex`,这样就不会破坏堆栈跟踪. (3认同)
  • 同意Scott和个人经验:如果你试图构建一个不仅仅是中等复杂的应用程序,你的错误条件是基于布尔返回值,你很快就会看到意大利面条编码,并意识到当错误是什么时你知道什么是错的从几个月前写的子程序的深度返回.基本问题是返回值必须通过多个层来处理可以处理它的代码,而异常"冒泡"到可以通过设计处理的位置. (2认同)

Alf*_*ers 5

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

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

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