使用特定的try catch,错误覆盖

时间:2014-10-15 19:39:30

标签: java

这是我的例外:

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。

2 个答案:

答案 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");
}