C#中处理异常时的良好实践我在ThePragmaticProgrammer和其他一些文章(包括来自JoelSpolsky的文章)中读到,你应该只在异常情况下抛出异常。否则,您应该返回一个错误。有时是可能的(例如,返回-1、-0或正数),但在其他情况下是不可能的。我的意思是,如果你要返回一个类,你总是可以返回null,但我认为这个想法是返回一些东西来提醒调用者发生了什么。如果我总是返回null,我想说:如果此方法返回null,可能是因为A、B、C、D或E那么,我如何在C#中实现这一点?编辑:在我发布这个问题几个小时后,我在这里看到了另一个问题,这个问题本身是关于发布代码作为一种好的做法。我知道这是我在这里做的另一种方式。链接在这里:一般财产缺点?通过使用数字,您直接与Microsoft推荐的例外相矛盾。我发现能够揭开整个主题神秘面纱的最佳信息来源是JeffreyRichter的TheCLRthroughC#3。此外,.NETFrameworkGuidelines一书中关于异常的材料也值得一读。引用MSDN:不要返回错误代码。异常是框架中报告错误的主要方法。您可以采用的一种解决方案是out参数,它获取结果。然后您的方法返回一个布尔值,就像您将在框架中遇到的许多TryParse方法一样。何时抛出异常的更好规则是:当您的方法没有按照其名称执行操作时,抛出异常。空值可用于指示您请求的内容不存在。对于任何其他错误情况,不应返回它。“仅在特殊情况下抛出异常”的规则对IMO的麻烦没有帮助,因为它不会为您提供基准来确定什么是异常,什么不是。这就像在说“只吃可食用的食物”。要考虑的一个例子是int.TryParse。它使用一个out参数作为解析值,并使用一个bool返回值来指示成功或失败。如果casebool可以用枚举或更复杂的对象代替。(例如,数据验证可能会以一种真正保证在收集时失败的方式失败,等等)。.NET4的替代方案是Tuple...所以int.TryParse可能是:publicstaticTupleTryParse(stringtext)下一个可能性就是让对象封装整个结果,包括合适的失效模式。例如,您可以向任务询问其结果、状态和失败时的异常。所有这一切只适用于发生的事情不是真正的错误。它并不表示错误,只是用户输入错误。我真的不喜欢返回错误代码——异常在.NET中更为惯用。Microsoft记录了.NET中错误处理的最佳实践http://msdn.microsoft.com/en-us/library/8ey5ey87(VS.71).aspx我建议遵循这些指南,因为它是.NET的标准,更不用说与其他.NET开发人员发生冲突。(请注意,我知道我发布了一个较旧的链接,但建议仍然存在。)我还意识到不同的平台对正确的错误处理有不同的看法。这可能是一个主观问题,但我会坚持上面所说的——在.NET中开发时遵循.NET指南。您可能需要考虑使用TryXXX模式和一些简单的重载以供客户端考虑。//异常publicvoidConnect(Optionso);//错误代码publicboolTryConnect(Optionso,outErrore);乔尔·斯波尔斯基错了。通过错误/返回代码返回状态意味着您不能相信任何方法调用的结果——返回值必须经过测试和处理。这意味着每个返回此类值的方法调用都会引入至少一个选择点(或更多,具体取决于返回值的域),从而引入更多可能的代码执行路径。所有这些都必须进行测试。因此,假设Method1()和Method2()的契约要么成功要么抛出异常,这段代码有1种可能通过它:foo.Method(...);酒吧.方法(...);如果这些方法通过返回码指示状态,那么它很快就会变得非常混乱。只返回二进制值:boolfooSuccess=foo.Method(...);如果(fooSuccess){boolbarSuccess=bar.Method(...);if(barSuccess){//事件的正常过程——做通常的事情}else{//处理bar.Method()失败}}else//foo.Method()失败{//处理foo.Method()failure}返回状态代码而不是在调用方法之前抛出异常,调用者应该检查以确保事情很重要(例如检查文件是否存在。如果文件不存在,不要尝试打开它)。强制执行方法的契约:如果违反契约,则抛出异常。如果发生任何意外情况,则会抛出异常。你的代码应该严格遵守纪律。我只返回像空引用或负索引值这样的值,当我确定它不会在其他开发人员使用代码时引起误解。就像LINQ函数IEnumerable.FirstOrDefault。IEnumerable.First为空集合抛出异常,因为它应该返回第一个元素,而空集合是一个异常。大家有用,需要多了解C#学习教程。希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
