如何避免方法中的try-catch语句?

时间:2013-02-18 21:01:20

标签: java try-catch

对我个人来说(这并不意味着我是正确的或者其他),包括try-catch语句在方法中“重载”他们的内部结构给读者。使用DB时,您应该包括SQLExceptions,ConnectionExceptions等等。有没有办法将所有例外的责任放在某个对象上?

我认为是这样的:

enum TaskEnum {
    doSmth1, doSmth2, doSmth3, doSmth4
}

class OuterClass {

    doWhatever(TaskEnum task, String… args) {
        try {
        switch(task) {
                case (doSmth1): InnerClassInstance.execute1(args); break;
                case (doSmth2): InnerClassInstance.execute2(args);break;
                case (doSmth3): InnerClassInstance.execute3(args);break;
                case (doSmth4): InnerClassInstance.execute4(args);break;

        } catch(Exception e) {
                 e.printStack()}
         }
     }
}

class InnerClass {    
    execute1(String args) throws Exception() {bla-bla-bla};
    execute2(String args)throws Exception() { bla-bla-bla };
    execute3(String args)throws Exception() { bla-bla-bla };
    execute4(String args)throws Exception() { bla-bla-bla };
}

通过这种方式,外部类将负责所有内部类方法抛出的异常。 当然,如果认为我的解决方案是好的,我不会问这个问题。这只是一个例子,让你理解这个想法。

请分享您对此的看法。

4 个答案:

答案 0 :(得分:5)

异常机制的优点在于它们发生的地方不必处理它们,而是在一个共同的地方,将处理许多可能的故障组合在一起。所以是的,肯定会推迟异常的处理,直到方便的时刻。主要有两种选择:

  1. 必须中止当前工作单元的失败:在包含整个事务范围的级别处理它们,并统一执行(通常是日志条目和上游客户端的错误消息);

  2. 例外情况仅表示工作单元内的替代程序流:这些是检查异常的良好候选者,因为它们必须特别及早地处理。不要在错误级别记录这些(可能是警告或只是信息,具体取决于上下文)。

  3. 不幸的是,Java检查的异常使得第一个选项更难实现,因为路上的每个方法都必须声明它可能抛出的所有已检查异常。还有一些常见的陷阱:Eclipse和其他工具提供了使用样板文件try-catch来包围您的代码,而应该让异常向上传播。当您实现的方法没有声明您遇到的已检查异常时,会出现特别困难的情况,迫使您过早处理它。在这种情况下,必须将已检查的异常包装RuntimeException并重新抛出它。这非常不明显,会导致许多错误,或至少重复错误日志条目。

答案 1 :(得分:1)

通常使用两种选项,就像你说的那样。要么处理它们出现的异常,要么使用较低级别的方法自己抛出错误,直到它达到处理所有异常的顶级类。我个人认为,例外情况应该在他们抛出的地方处理,并且应该尽可能具体。我不是第二种选择的粉丝,因为它对顶级课程负有太多责任。这真的是你的偏好,当然你应该只在方便的时候处理这​​个例子,并且这样做是有道理的。

答案 2 :(得分:1)

我仍然没有得到你想做的事。只打印堆栈跟踪的catch块是恕我直言,而不是无用。提供一个任务枚举只是为了打开它的值,这对我来说没有意义。如果您想沿着这条路走下去,请使用Java提供的功能:

enum TaskEnum {
    doSmth1() {
        public void execute(String... args) {
            // blablabla
        }
    },
    doSmth2() {
        public void execute(String... args) {
            // blablabla
        }
    };

    public abstract void execute(String... args);
};

class OuterClass {

    public void doWhatever(TaskEnum task, String... args) {
        try {
            task.execute(args);
        } catch (Exception e) {
            e.printStackTrace();
            // and do something useful!
        }
    }

}

但要么根本不捕获异常,或者在需要时将它们包装在另一个异常类中(即当超类对抛出的异常施加限制时),它会更好。

答案 3 :(得分:0)

throws不能在类级别使用,只能在方法级别使用。

你可以这样做:

public void method() throws IOException {

}