2

就我个人而言(这并不意味着我是对的或其他),包括方法中的 try-catch 语句为读者“重载”了它们的内部结构。使用数据库时,您应该包括 SQLExceptions、ConnectionExceptions 等内容,也许更多。有没有办法将所有异常的责任放在某个 ONE 对象上?

我是这样想的:

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

4 回答 4

5

异常机制的美妙之处在于不必在它们发生的地方处理它们,而是在一个共同的地方,将许多可能的故障的处理组合在一起。所以,是的,绝对将异常处理推迟到方便的时候。有两个主要选择:

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

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

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

于 2013-02-18T21:08:41.797 回答
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!
        }
    }

}

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

于 2013-02-18T21:22:02.647 回答
1

有两个常用的选项,和你说的差不多。要么处理出现的异常,要么让较低级别的方法自己抛出错误,直到它到达处理所有异常的顶级类。我个人觉得异常应该在抛出的地方处理,并且应该尽可能的具体。我不喜欢第二种选择,因为它给顶级班级带来了太多责任。不过,这确实是您的偏好,当然您应该只在方便且有意义的情况下处理异常。

于 2013-02-18T21:07:30.497 回答
0

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

你可以这样做:

public void method() throws IOException {

}
于 2013-02-18T21:06:01.947 回答