有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在遗留代码中捕获并忽略java异常

有一个遗留Java项目

在代码审查期间,我注意到我的同事替换了代码

    } catch (Exception e) {
        ok = false;
    }
    // and ok was never used since then

    } catch (Exception e) {
        e.printStackTrace();
    }

也就是说,最差的实践“忽略异常”被第二差的“将异常打印到标准输出并继续”所取代。(同事们相信代码不会因此变得更糟。)

我知道这里面有一个完整的holy war,真正聪明的人建议每个人在发现异常之前首先思考。不幸的是,这似乎还没有完成。遗留代码捕获异常并忽略它们。修改代码以抛出异常而不是忽略异常是可能的,但是没有人知道有多少用例场景会因此而中断。单元测试没有帮助,因为单元测试不包括该方法。甚至没有人知道该方法在多少种情况下被调用

鉴于调用方和被调用方法之间的约定不明确,我们如何处理捕获和忽略异常的遗留代码


共 (1) 个答案

  1. # 1 楼答案

    在某些情况下,预期会出现异常,可以安全地继续。在任何情况下,您都应该使用记录器框架来记录异常,而不是

    e.printStackTrace();
    

    所以首先你应该把它转换成

    logger.error("context", e);
    

    一些选择:

    • 使用日志检测哪些异常是正常的,并将它们降级为logger.info()logger.debug()(如@Ivan所评论)
    • 一段时间后,更改其余位置以抛出新的选中的异常。这将允许您获得编译器关于哪些其他代码将受到影响的反馈。稍后,您可以恢复为未选中状态。
      • 启动单元测试
      • 开始保护产品的主循环/入口点,防止任何地方发生未经检查的异常