Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用bool(返回类型)处理异常或将异常传递给客户端?_C#_.net_Exception_Exception Handling_Try Catch - Fatal编程技术网

C# 使用bool(返回类型)处理异常或将异常传递给客户端?

C# 使用bool(返回类型)处理异常或将异常传递给客户端?,c#,.net,exception,exception-handling,try-catch,C#,.net,Exception,Exception Handling,Try Catch,我正在试图找到处理异常的最佳方法,我的应用程序有很多层,并开始使用BOOL的返回类型,即如果失败,则返回False,如果成功,则返回True 这在SaveMyRecord(somerecord)等方法中非常有效;因为我正在传递值,不需要返回任何内容,所以我可以使用bool的返回类型来指示它是否成功 但它让我想到,像GetMyRecord()这样的东西实际上返回IQueryable类型,因此我不能使用bool来告诉我它是否失败 问题是我正在处理我的许多错误,这些错误是通过try-and-catch

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

这在SaveMyRecord(somerecord)等方法中非常有效;因为我正在传递值,不需要返回任何内容,所以我可以使用bool的返回类型来指示它是否成功

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

问题是我正在处理我的许多错误,这些错误是通过try-and-catch发生的,因此我不希望客户机收到异常

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

也许我应该将异常传递回客户机并在那里处理它

是否有一些标准或文档可供您参考?

您应该开始阅读

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


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

将异常发送到客户端并在那里处理。一定要把所有细节都传上去。大多数最佳实践几乎完全同意这一点,最终总是在外围处理,在本例中是客户端,但在其他情况下可能是web服务

仅捕获如果您想记录它,向它添加更多信息,或者尝试从特定异常中恢复。在每种情况下,您要么抛出一个新异常,将原始异常作为内部异常,要么简单地“抛出”原始异常,正如注释中所指出的,不要“抛出前异常”


这个问题几乎是重复的,你会发现很多现有的问题都得到了很好的回答。我昨天才回答了一个问题

这是个好问题


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

如果一个方法不能完成它的工作,它应该抛出异常。永远不要因此返回异常。

推荐并被视为最佳实践的方法是使用异常。您可以(也应该)阅读,其中包含异常和try-parse模式的指导原则

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

  • 很容易被程序员忽略
  • 不能在所有情况下使用。如果构造函数失败,会发生什么?不可能从构造函数显式返回值

至于何时处理异常,只有当您能够对异常做一些有意义的事情时,才应该处理它们。总是处理异常以使客户端永远看不到异常的问题在于,您最终可能会处理不应该出现的异常,并在以后导致更多问题(如实际丢失数据)。

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


在某些情况下,使用不同的模式可能会有所帮助,并让例程在出现问题时接受要调用的委托。该委托可能返回异常,或者导致底层例程返回false,或者可能执行其他操作。请注意,在代理运行时,信息将可用,这些信息将在捕获任何异常之前被销毁。例如,如果例程应该从文件中读取行并将字符20-37转换为日期,那么如果出现解析错误,记录整个输入行可能会有所帮助。使用传入的委托,可以做到这一点;如果没有这样的东西,它将变得更加困难。

您在服务器端和客户端使用什么?例如:WCF、ASMX、WinFoms、WebForms。如果你把@AlfredMeyers和@dove的话结合起来,你就会得到我计划给你的答案。与其在一个综合答案中添加他们所说的内容,我想说的是阅读这两个答案。不过,最重要的是阅读+每项服务1个。服务是否面向互联网?安全要求是什么?您是否担心通过异常暴露潜在的不安全信息?@Alfredmayers-我使用了许多层,1位于wcfAs后面,仅捕获日志,只要您在记录异常后重新显示该异常,就可以了。如果这样做,请确保只使用
throw
语句而不是
throw ex
,这样就不会破坏堆栈跟踪。@Scott绝对正确。此外,如果要添加更多信息,请将原始异常作为内部异常添加到您创建的新异常中。如果你在n次之后无法恢复,那么按你说的扔。以为你知道这一切;)但从个人经验来看,这可能会帮助其他读者同意Scott的观点:如果你试图构建一个更为复杂的应用程序,其中错误条件基于布尔返回值,那么你很快就会看到意大利面编码,并意识到当从深度返回false时,你对出错的地方知之甚少几个月前写的一个子程序。基本问题