这是我的异常(exception):
public class MyException extends Exception {
private String errorCode="Unknown_Exception";
public MyException(String message, String errorCode){
super(message);
this.errorCode=errorCode;
}
public String getErrorCode(){
return this.errorCode;
}
}
现在想象一下下一个场景,代码太长,无法粘贴到这里:
1 我在Presentation包中得到了一个用Swing制作的Presentation类
2 在包计算中,我使用接收到的数据库字段中的少量数字进行了简单的操作
3 在包连接中我得到了数据库连接
麻烦来了:
-在表示层中,我捕获所有错误,如下所示:
try {
//here is a method called updateCombo() wich throws:
//throw new MyException(e.getMessage(),"ERROR_UPDATING_COMBO_BOX");
} catch (MyException ex) {
try {
//Here we process error code, if error is not defined, uses default errors.
processCode(ex);
} catch (MyException ex1) {
Logger.getLogger(Presentacion.class.getName()).log(Level.SEVERE, null, ex1);
}
}
processCode 是一个包含案例的简单列表,如下所示:
private void processCode(MyException e) throws MyException {
switch (e.getErrorCode()) {
case "ERROR_UPDATING_COMBO_BOX":
lblErrorText.setText("Error updating combo.");
throw e;
case "ERROR_SELECTING_PRIMARY_KEY":
lblErrorText.setText("Error selecting PK");
throw e;
case "ERROR_OPENING_CONNECTION":
lblErrorText.setText("Error opening connection.");
throw e;
default:
lblErrorText.setText("Excepcion not defined: "+ e.getMessage());
e.printStackTrace();
}
这是场景,第三个包中的连接失败并导致以下情况:
throw new MyException(e.getMessage(),"ERROR_OPENING_CONNECTION");
正如我所说,错误是通过方法头中的 throws 子句向上层抛出的,这是第二个包。
由于连接失败,第二个包还向演示抛出了一个新的异常:
throw new MyException(e.getMessage(),"ERROR_SELECTING_PRIMARY_KEY");
表示方法也会抛出此异常,因为第二层失败:
throw new MyException(e.getMessage(),"ERROR_UPDATING_COMBO_BOX");
主要问题:
使用调试我发现程序做了它必须做的事情。它到达连接层并成功完成此操作:
throw new MyException(e.getMessage(),"ERROR_OPENING_CONNECTION");
但是,在第二层计算中,如果连接失败,则会抛出一个新的异常:
throw new MyException(e.getMessage(),"ERROR_SELECTING_PRIMARY_KEY");
这就是问题:
throw new
抛出新异常会用 ERROR_SELECTING_PRIMARY_KEY 覆盖 ERROR_OPENING_CONNECTION。当它由于“抛出新的”而进入演示文稿时,用 ERROR_UPDATING_COMBO_BOX 覆盖 ERROR_SELECTING_PRIMARY_KEY,导致屏幕上显示最终错误:
lblErrorText.setText("Error updating combo.");
一旦发现第一个错误,有没有办法返回演示文稿,而不会被下一个错误覆盖?
也许我误解了这个概念,但我想捕获所有可能的错误,因为:
-如果连接正常但第二层中的方法失败,则应抛出 ERROR_SELECTING_PRIMARY_KEY。
-如果第二层(计算)执行正常,但呈现错误,则应导致 ERROR_UPDATING_COMBO_BOX。
最佳答案
您可以使用e.getCause()
,它将返回一个Throwable
并检查此原因是否属于MyException
。如果是,您可以再次递归检查e.getCause()
,直到获得堆栈跟踪中最深的错误代码并对此异常进行验证。
这是一个例子:
public MyException getDeepestException(MyException e) {
Throwable t = e.getCause();
if (t instanceof MyException) {
return getDeepestException((MyException)t);
}
return e;
}
正如 @RealSkeptic 所指出的,为了使用这种方法,您需要向自定义异常添加一个额外的构造函数:
public MyException(String message, Throwable cause, String errorCode){
super(message, cause);
this.errorCode = errorCode;
}
当抛出异常时,调用正确的构造函数:
try {
//...
} catch (SomeException e) {
throw new MyException(<a proper message should be here>, e, "ERROR_SELECTING_PRIMARY_KEY");
}
关于java - 使用特定的try catch,错误覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26390717/