何时躲避异常以及何时处理它们

时间:2008-12-12 01:27:46

标签: exception exception-handling

在决定是否允许方法避免异常时(例如:让异常传播)或者在收到异常后处理它时,您使用了什么guidlines?

这是我想要问的一个例子

如果我有三个方法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;
        }
    }

5 个答案:

答案 0 :(得分:7)

我遵循的规则:

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

我总是尝试尽可能地将异常修复为树中的异常(即在它们发生之后尽快) - 这样可以对异常处理进行本地化处理,并避免在上层使用大的honkin'异常处理程序。

答案 1 :(得分:1)

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

事实上,大多数例外应该是特殊的,所以一般来说,我倾向于喜欢它们在应用程序发生时中断。如果异常表示某些可恢复的错误条件,那么当您拥有安全所需的信息时,应该在调用堆栈中的某个位置处理它。这将包括用户可以纠正错误的情况,即捕获异常以将其报告给用户,以便他们可以采取适当的措施。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

只捕获您可以处理的异常。让其他一切都过去。

答案 4 :(得分:-1)

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

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