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

标签 java

这是我的异常(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/

相关文章:

java - 在 Java 中使用文件名和扩展名清理字符串

java - 当原始列表被修改时,Collections.in modulated list() 返回的 Arraylist 会发生什么?

java - 捕获和显示图像

java - 简单的 Picasa 图片上传代码示例

java - 获取 PKIX 路径构建失败

Java HashMap<String, Set<Int>> 添加集合元素后丢失

java - Tomcat启动性能: How to prevent waiting until all webapps are deployed?

java - VIew 构造函数上的 NoSuchMethodError

java - Hashmap 中的 NullPointerException 错误

java - 为特定类中的特定类型自定义 Jackson Serializer