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

Java 如何避免方法中的try-catch语句?,java,try-catch,Java,Try Catch,就我个人而言(这并不意味着我是对的或是别的什么),在方法中包含try-catch语句,为读者“重载”它们的内部结构。当使用DB时,您应该包括诸如SQLExceptions、ConnectionExceptions之类的内容,也许更多。有没有办法把所有例外的责任放在某个对象上 我是这样想的: enum TaskEnum { doSmth1, doSmth2, doSmth3, doSmth4 } class OuterClass { doWhatever(TaskEnum ta

就我个人而言(这并不意味着我是对的或是别的什么),在方法中包含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 };
}
这样,外部类将负责由其所有内部类方法引发的异常。 当然,如果我认为我的解决方案是好的,我不会问这个问题。这只是一个例子,让你理解这个想法


请分享您的想法。

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

你可以做:

public void method() throws IOException {

}

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

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

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

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


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

    我仍然不明白您要做什么。只打印堆栈跟踪的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!
            }
        }
    
    }
    
    但最好是根本不捕获异常,或者在需要时将它们包装到另一个异常类中(即,当一个超类对抛出的异常施加限制时)