当前位置: 首页 > 编程语言 > C#

C#LearningTutorial-ChoosingBetweenExceptionandReturnValueShare

时间:2023-04-10 16:01:18 C#

ChoosingBetweenExceptionandReturnValue我创建了一个从文件中解析一些文档的类。classParser{publicParse(stringfileName){///}}有时可能会出现解析错误,解析器必须返回一些数据。我为此创建了特殊课程。classParsingError{//somedata}我怎样才能正确处理这些错误。我至少有两个选择:创建我自己的异常或返回值。选项1myParser.Parse(fileName,outerror);选项2try{myParser.Parse(fileName)}catch(MyParsingExceptionex){//使用ex.Error字段}UPDATE如果我没记错的话,异常背后的意识形态只是它应该处理一些特殊的东西,一些该方法不打算处理的情况。这让我想知道是否例如:解析器在文件中找到一个未知字段,或者编码错误。这会被视为特例吗?想想修复错误是多么典型。如果这是典型的-支持返回值。例外应该用于不寻常的事情。.NETland的异常概念与其他平台略有不同。在.NET领域很快就会意识到您不再在OZ中,并且经常会抛出异常。来自.NET4上的MSDN:不返回错误代码。异常是框架中报告错误的主要方法。来自.NET4.5上的MSDN:异常是执行程序遇到的任何错误情况或意外行为。他们给出的一个例子是客户端无法连接到端点。因此,如果您认为有时网站不可用或出于其他不符合“例外”传统定义的原因,您可以了解它们的创建者打算如何使用例外。我会选择三个ParseResultresult=myParser.Parse(filename)这里的ParseResult可以提供更多关于解析结果的细节,包括正面的和负面的。如果失败案例非常罕见并且被认为是意外结果,那么我会选择您的选项2并抛出异常。当然,最终的解决方案可能是组合,在ParseResult中返回常见错误,但无法打开文件等异常情况则表现为异常。这取决于MyParsingException是否只是System.Exeption的派生类,或者它包含有关尝试解析文件的错误的附加信息。如果没有这些信息,那么我认为Parse方法应该返回一个字符串,如果发生错误则返回null:publicstringParse(stringfileName){stringres=null;try{///解析文件,将解析结果赋给res}catch{res=null;}返回资源;或者,如果该例程真的有用,有关文件(名称)、行号等的信息:publicstringParse(stringfileName){stringres=null;int错误线=-1;try{//foreachlineoftexttoparse--errorLine=lineNumber;///解析文件,将解析结果赋给res}catch(Exeptionex){MyParsingExceptionmyEx=newMyParsingException("parsingerror",ex);myEx.Data["文件名"]=文件名;myEx.data["lineNumber"]=errorLine;扔我的前任;}返回资源;}//然后你可以获得一些非常有用的信息:try{myParser.Parse(fileName)}catch(MyParsingExceptionex){//使用ex.Data获取“fileName”和“lineNumber”属性。在直接调用者必须处理无效条件的情况下,错误标志或返回值通常更好。如果有许多函数调用可能以特定方式失败,那么异常通常会更好,并且所有这些调用的错误处理都应该相同。通常,方法的作者不知道哪种情况将适用于它的调用者(实际上,一些调用者更适合一种模式而不是另一种模式)。Microsoft首选的处理方式是使用以下模式:ThingGetThing(intparam1,stringparam2);boolTryGetThing(intparam1,stringparam2,outThingresult);这肯定比将调用者限制为一种模式或另一种模式更合适。这种模式是一个更好的概念,尽管我不喜欢具体的实现。Microsoft明确建议使用单独的方法,而不是带有参数的方法,该参数指示是否应在失败时抛出异常,但这种理念是有代价的:这意味着如果GetThing或TryGetThing的其中一个步骤可以用“do”调用或“try”方法,GetThing和TryGetThing的代码必须大量重复,一个调用“do”方法,另一个调用“try”方法。另一种方法是使用委托或接口类型对象来指示“try”方法在发生异常时应该做什么。例如,可以有一个函数:ThingTryGetThing(intparam1,stringparam2,boolThrowOnError,outErrorInfoerrInf);如果省略最后两个参数虚拟变量,则可能有一个重载会为ThrowOnError调用上面的true。如果TryGetThing使用的方法遵循类似的模式,则可以在不为try/do情况复制代码的情况下调用它们。如果你的API说它处理解析错误,那么这不是一个例外情况,也许应该返回解析错误。对于丢失文件、锁定文件、无效输入(除了狡猾的解析之外)等其他事情,您应该抛出异常。对我来说,这取决于我打算如何使用错误以及它是什么类型的错误。该方法的上下文也很重要。如果预计该方法每隔一段时间就会在xml中出错,在我看来这不是例外,应该相应地对待。假设我正在编写一个XML验证器,然后返回一个错误是可行的方法。如果我正在编写一个XML配置解析器,异常似乎更合适。以上就是C#学习教程的全部内容:异常与返回值的取舍。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: