为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕容森 2023-09-06 15:40:38
考虑以下 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);}
查看完整描述

1 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

抛出异常是昂贵的操作。因此,如果您考虑两种选择 - 投掷和不投掷,那么不投掷是更好的方法。


然而,使用异常作为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);

}


查看完整回答
反对 回复 2023-09-06
  • 1 回答
  • 0 关注
  • 67 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信