使用现有的 try/catch 块或重复的 catch 块而不引发异常

考虑以下 try/catch 块:


try {

    throwCheckedException();

} catch (IOException e) {

    doStuffWithException(e);

}

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


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);

}


慕容森
浏览 68回答 1
1回答

幕布斯7119047

抛出异常是昂贵的操作。因此,如果您考虑两种选择 - 投掷和不投掷,那么不投掷是更好的方法。然而,使用异常作为doStuffWithExceptionin的输入参数try-block,感觉代码很小。因此,我建议重构异常处理逻辑,使其不依赖异常作为输入参数。如果您根据异常中的某些数据来处理异常情况 - 提取该数据并传递给handle方法。基本上,不要将异常用作 DTO 或 POJO(因为异常不是用于此目的)。总结一下,我建议使用类似以下片段的内容: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);}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java