1

在决定是让方法躲避异常(即:让异常传播)还是在收到异常后处理它时,您使用什么指导方针?

这是我要问的一个例子

如果我有三个方法method1、2、3和3。Method1调用Method2,后者调用Method3。并且该异常仅在方法3中引发,我应该让异常向上传播如下(请原谅我的伪java;))

   method1 {
        try {
            call method2;
        } catch (exception e) {
            doErrorProcessing;
        }
    }

    method2 throws exception {
        call method3;
    }

    method3 throws exception {
        call readFile;
    }

一旦异常引发如下,我什么时候应该处理它

   method1 {
        call method2;
    }

    method2 {
        call method3;
    }

    method3 {
        try {
            call readFille
        } catch (exception e) {
            doErrorProcessing;
        }
    }
4

5 回答 5

7

我遵循的规则:

如果我可以修复异常,或者消除导致它的问题(有时这意味着完全忽略它),我会处理它。否则它会被传递到下一个级别。

而且我总是尝试在树中尽可能低地修复异常(即在它们发生后尽快) - 这会本地化异常处理并避免在您的上层中使用大型异常处理程序。

于 2008-12-12T01:38:09.473 回答
1

就像软件中的所有答案一样,这对我来说是“取决于”。

事实上,大多数异常应该是异常的,所以通常我倾向于喜欢它们在它们发生时破坏应用程序。如果异常代表一些可恢复的错误情况,那么当您拥有安全操作所需的信息时,应该在调用堆栈中的点处处理它。这将包括用户可以纠正错误的情况,即捕获异常以将其报告给用户,以便他们可以采取适当的措施。

于 2008-12-12T01:37:18.273 回答
0

如果较低级别的例程知道如何处理异常情况,它可能应该处理它。如果它是一个与函数要执行的任务无关的异常情况,那么让它在更高级别上处理可能更有意义。

于 2008-12-12T01:36:44.920 回答
0

只捕获您可以处理的异常。让其他一切从你身边经过。

于 2008-12-12T01:38:55.667 回答
-1

从 Java 的角度来看,我总是尝试使用未经检查的异常来避免在方法签名中添加 throws 声明。

然后我实际捕获异常的位置将取决于情况。我总是希望在异常适用的情况下尽可能地处理链中的异常。如果它是您期望应用程序崩溃的系统级异常,那么我可能有一个异常处理机制,它将“捕获所有”。

于 2008-12-12T01:42:37.157 回答