我试图找出处理异常的最佳方法,我的应用程序有很多层,并开始使用返回类型的BOOL,即如果失败则返回False,如果成功则返回True .. < / p>
这在SaveMyRecord(somerecord)等方法中效果很好;因为我传递的值并且不需要任何返回,所以我可以使用bool的返回类型来指示它是否成功。
但后来它让我觉得像GetMyRecord()这样的东西实际上返回了IQueryable的类型,因此我不能用bool告诉我它是否失败。
事情是我处理了很多我的错误,它们发生在try和catch中,因此不希望客户端收到异常。
也许有更好的方法,然后我考虑使用OUT参数但这意味着我需要更改所有方法的签名并添加aditional params ..
也许我应该将异常传递回CLIENT并在那里处理它?</ p>
是否有一些标准或任何文档可以提供最佳实践?
答案 0 :(得分:10)
冒泡客户端的异常并在那里处理它。绝对将其全部细节传递给它。大多数最佳实践几乎完全同意这一点,总是最终处理外围,在这种情况下是CLIENT,但在其他情况下可能是Web服务。
仅捕获,如果您想记录,添加更多信息,或尝试从恢复一个特别的例外。在每种情况下,您将要么将原始内容作为内部抛出一个新的异常,或者只是按原样“抛出”原始内容,并且如注释中所指出的那样不会“抛出前”
这个问题是接近重复,您会发现很多关于SO的现有答案非常好的问题。我昨天才回复similar one
答案 1 :(得分:5)
您应该开始阅读Design Guidelines for Exceptions
然后,根据您的情况,您应该考虑其他因素,例如异常屏蔽。
例如:如果您使用Web服务(ASMX或WCF)作为后端,您可能需要查看Improving Web Services Security并阅读有关异常处理的部分。
答案 2 :(得分:4)
如果一个方法无法完成它的工作,它应该抛出异常。永远不要返回异常。
答案 3 :(得分:2)
建议并被视为最佳做法的方法是使用例外。您可以(并且应该)阅读Framework Design Guidelines (2nd Ed.),其中包含例外指南和try-parse模式。
使用返回码(数字或布尔值)有一些问题,最大的两个是:
至于何时处理异常,你应该只在你可以对异常做一些有意义的事情时处理它们。始终处理异常以便客户端永远不会看到它们的问题是,您最终可能会处理一个您不应该拥有的异常,并在以后导致更多问题(例如实际上丢失数据)。
答案 4 :(得分:1)
这个问题很棒!
不要为异常编码。在大多数情况下假装他们从未发生过。我担心两个地方的异常:向用户显示错误反馈和资源管理(即抛出异常时关闭打开的文件)。
答案 5 :(得分:1)
MS似乎喜欢的一种常见模式是使用返回'int'的ComputeSomething()方法,以及接受对整数的引用并返回Boolean的TryComputingSomething()方法。后者在成功时将其计算存储在传入变量中并返回True;如果因“预期”原因而失败,则返回False。请注意,任一例程中的意外故障都可能引发异常。
在某些情况下,使用不同的模式可能会有所帮助,并且例程接受在遇到问题时要调用的委托。该委托可以返回异常,或者导致底层例程返回false,或者可能做其他事情。请注意,在委托运行时,将提供可在捕获任何异常之前销毁的信息。例如,如果一个例程应该从文件中读取行并将字符20-37转换为Date,那么如果出现解析错误,则记录整个输入行可能会有所帮助。使用传入的委托,可以做到这一点;如果没有这样的话,那就更难了。