Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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# 捕获函数调用链中的异常_C#_Exception_Exception Handling_Try Catch - Fatal编程技术网

C# 捕获函数调用链中的异常

C# 捕获函数调用链中的异常,c#,exception,exception-handling,try-catch,C#,Exception,Exception Handling,Try Catch,捕获异常的正确位置/方式是什么? Say方法m1抛出异常e1。方法m2调用m1。我是否应该在m2中捕获异常e1。或者,如果我知道m3调用m2并且我在m3中调用了m2,我可以避免在m2中使用try catch块吗 try { m2(); } catch { .... } 我不认为在何时使用try/catch块而不是简单地进一步传播异常方面有一个严格的规则。然而,一般来说,只有当包含try/catch块的方法能够有效地处理它捕获的异常时,才使用try/catch块才有意义。如果不能处理异常,那

捕获异常的正确位置/方式是什么? Say方法m1抛出异常e1。方法m2调用m1。我是否应该在m2中捕获异常e1。或者,如果我知道m3调用m2并且我在m3中调用了m2,我可以避免在m2中使用try catch块吗

try
{
  m2();
}
catch
{
....
}

我不认为在何时使用try/catch块而不是简单地进一步传播异常方面有一个严格的规则。然而,一般来说,只有当包含try/catch块的方法能够有效地处理它捕获的异常时,才使用try/catch块才有意义。如果不能处理异常,那么捕获异常是没有意义的


关于你上面的问题,如果在M2中没有处理异常的合理方法,但在M3中有一种,我会继续抛出异常链。否则,如果你能在M2中处理它,就去做吧

对于何时使用try/catch块而不是简单地进一步传播异常,我认为没有硬性规定。然而,一般来说,只有当包含try/catch块的方法能够有效地处理它捕获的异常时,才使用try/catch块才有意义。如果不能处理异常,那么捕获异常是没有意义的


关于你上面的问题,如果在M2中没有处理异常的合理方法,但在M3中有一种,我会继续抛出异常链。否则,如果你能在M2中处理它,就去做吧

当有疑问时,请使用以下逻辑:当前方法是否完全能够以潜在调用方不知道异常曾经发生的方式处理异常

  • 如果是,则捕获并处理方法本身中的异常
  • 如果没有,那么在出现异常(日志记录等)时,该方法是否有任何未完成或额外的工作?
    • 如果是,则捕获异常,执行工作并重新显示异常
    • 如果没有,则根本不捕获异常,而是让它在调用堆栈中冒泡

简言之,只有在本地完全能够恢复时才处理异常。

如果有疑问,请使用以下逻辑:当前方法是否完全能够以潜在调用方不知道异常曾经发生的方式处理异常

  • 如果是,则捕获并处理方法本身中的异常
  • 如果没有,那么在出现异常(日志记录等)时,该方法是否有任何未完成或额外的工作?
    • 如果是,则捕获异常,执行工作并重新显示异常
    • 如果没有,则根本不捕获异常,而是让它在调用堆栈中冒泡

总之,,只有在本地完全能够恢复时才处理异常。

要问的一个重要问题是“我是否应该在这里捕获异常?”如果您处理的是磁盘之类的外部资源,那么答案可能是肯定的,否则可能是否定的-如果代码中有错误时崩溃,那么代码会更好

按照上面的步骤,通常最好保持try捕获尽可能小,这样就不会意外地在代码中隐藏任何bug。我认为在你的例子中,它放在m1中

这样,您也不必为一个被多次使用的方法在所有客户端代码中编写try-catch。按照此逻辑,您通常会得到一个结果对象(或者如果合适,更简单地返回null),可以查询该对象以查看是否存在错误。更好的是,如果出现错误但有人试图读取失败操作的结果(如果合适),您可以让这个结果对象抛出自己的异常。通过这种方式,您可以使用异常来避免编程错误。。。只要您不捕获异常作为控制程序流的一种方式


我确信在这个话题上还有很多其他的观点,但是一个重要的问题是“我应该在这里捕获异常吗?”如果你处理的是像磁盘这样的外部资源,那么答案可能是肯定的,否则可能是否定的-如果代码中有错误时崩溃,那么代码会更好

按照上面的步骤,通常最好保持try捕获尽可能小,这样就不会意外地在代码中隐藏任何bug。我认为在你的例子中,它放在m1中

这样,您也不必为一个被多次使用的方法在所有客户端代码中编写try-catch。按照此逻辑,您通常会得到一个结果对象(或者如果合适,更简单地返回null),可以查询该对象以查看是否存在错误。更好的是,如果出现错误但有人试图读取失败操作的结果(如果合适),您可以让这个结果对象抛出自己的异常。通过这种方式,您可以使用异常来避免编程错误。。。只要您不捕获异常作为控制程序流的一种方式


我相信在这个话题上还有很多其他的观点,不过。。。这是可以辩论的。这是一个风格和偏好的问题。通常,一个方法应该处理与其内部功能相关的异常,并抛出与该方法应该做什么相关的异常。那么这也取决于语言。检查这个:一般来说,请看。嗯。。。这是可以辩论的。这是一个风格和偏好的问题。通常,一个方法应该处理与其内部功能相关的异常,并抛出与该方法应该做什么相关的异常。那么这也取决于语言。选中此项:一般情况下,请参见。