对我个人来说(这并不意味着我是正确的或者其他),包括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 };
}
通过这种方式,外部类将负责所有内部类方法抛出的异常。 当然,如果认为我的解决方案是好的,我不会问这个问题。这只是一个例子,让你理解这个想法。
请分享您对此的看法。
答案 0 :(得分:5)
异常机制的优点在于它们发生的地方不必处理它们,而是在一个共同的地方,将处理许多可能的故障组合在一起。所以是的,肯定会推迟异常的处理,直到方便的时刻。主要有两种选择:
必须中止当前工作单元的失败:在包含整个事务范围的级别处理它们,并统一执行(通常是日志条目和上游客户端的错误消息);
例外情况仅表示工作单元内的替代程序流:这些是检查异常的良好候选者,因为它们必须特别及早地处理。不要在错误级别记录这些(可能是警告或只是信息,具体取决于上下文)。
不幸的是,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 {
}