【问题标题】:When to dodge exceptions and when to handle them何时躲避异常以及何时处理异常
【发布时间】:2008-12-12 01:27:45
【问题描述】:

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

这是我想问的一个例子

如果我有三个方法method1、2、3和3。Method1调用Method2,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;
        }
    }

【问题讨论】:

    标签: exception exception-handling


    【解决方案1】:

    我遵循的规则:

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

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

    【讨论】:

    • 我会进一步澄清规则:如果例程可以满足其后置条件,它应该返回。如果它不能满足它的后置条件,它应该抛出或泄漏一个异常。如果例程执行中发生的异常会阻止它满足其后置条件,则该异常应该泄漏或重新抛出。如果异常不会阻止例程满足其后置条件,则例程应该吞下异常并正常返回。
    【解决方案2】:

    就像软件中的所有答案一样,这对我来说是“视情况而定”。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2011-06-09
            • 2011-05-29
            • 1970-01-01
            • 2013-07-24
            • 1970-01-01
            • 2013-03-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多