【问题标题】:Use existing try/catch block or duplicate catch block without throwing exception使用现有的 try/catch 块或重复的 catch 块而不抛出异常
【发布时间】:2019-09-26 17:31:43
【问题描述】:

考虑以下 try/catch 块:

try {
    throwCheckedException();
} catch (IOException e) {
    doStuffWithException(e);
}

在上面的块中,throwCheckedException 有机会抛出一个检查异常,所以我需要一个调用 doStuffWithException 的 catch 子句。但是,假设我想在此块中添加一条附加语句:

if (!someBoolean) {
    throw new IOException("someBoolean must be true, got false.");
}

我应该使用 catch 块并将上面的代码简单地插入到 try 块中,还是复制 catch 块中的内容会更好,如下所示?

try {
    throwCheckedException();
    if (!someBoolean) {
        doStuffWithException(
            new IOException("someBoolean must be true, got false.")
        );
    }
} catch (IOException e) {
    doStuffWithException(e);
}

【问题讨论】:

    标签: java exception try-catch


    【解决方案1】:

    抛出异常是昂贵的操作。所以,如果你考虑两种选择——投掷和不投掷,那么不投掷是更可取的方式。

    但是,在try-block 中使用异常作为doStuffWithException 的输入参数,感觉就像代码很小。因此,我建议重构异常处理逻辑,使其不依赖异常作为输入参数。

    如果您根据异常中的某些数据处理异常情况 - 提取该数据并传递给 handle 方法。基本上,不要将异常用作 DTO 或 POJO(因为异常不适用于此目的)。

    总结一下,我建议有类似以下sn-ps的东西:

    try {
        throwCheckedException();
        if (!someBoolean) {
            Data data = createData();
            handle(data);
        }
    } catch (IOException e) {
        Data data = createDataFromMessage(e.getMessage());
        handle(data);
    }
    

    或者,减少try-block内部的嵌套:

    try {
        throwCheckedException();
    } catch (IOException e) {
        Data data = createDataFromMessage(e.getMessage());
        handle(data);
    }
    
    if (!someBoolean) {
        Data data = createData();
        handle(data);
    }
    
    

    【讨论】:

      猜你喜欢
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 2012-02-20
      • 2017-10-03
      • 2020-12-16
      • 1970-01-01
      相关资源
      最近更新 更多