这是我的例外:
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我在演示包中使用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();
}
这就是场景,连接在第3个包中失败并导致这个:
throw new MyException(e.getMessage(),"ERROR_OPENING_CONNECTION");
正如我所说,错误是在方法标题中使用throws子句抛出到上层,这是第二个包。 由于连接失败,第二个包也会向Presentation抛出一个新的异常:
throw new MyException(e.getMessage(),"ERROR_SELECTING_PRIMARY_KEY");
由于第二层失败,演示方法也会抛出此异常:
throw new MyException(e.getMessage(),"ERROR_UPDATING_COMBO_BOX");
使用debug我发现该程序可以完成它必须做的事情。它到达连接层并成功完成:
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。
答案 0 :(得分:3)
您可以使用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");
}
答案 1 :(得分:0)
如果我理解正确,如果一个包捕获的异常碰巧是MyException,你想要传递原始MyException,否则(如果异常是其他类型的Exception)你要创建一个新的MyException。
在这种情况下,您应该有两个catch子句。
try {
// Whatever you do in the try clause
} catch ( MyException myEx ) {
throw myEx;
} catch ( Exception e ) {
throw new MyException(e.getMessage(),"ERROR_SELECTING_PRIMARY_KEY");
}