如何使用ArchUnit验证方法不抛异常且方法签名不声明受检异常?
ArchUnit 使用问题解答
问题1:是否可以通过ArchUnit验证任意方法都不会抛出任何异常
首先需要明确两类场景的差异:
- 若验证目标为禁止方法在签名中声明抛出任何异常:可以通过ArchUnit实现,使用内置的
notDeclareAnyThrowable()规则即可匹配对应要求,示例代码如下:
ArchRule methods_not_declare_any_throwable = methods() .that() .resideInAPackage("com.your.business.package..") // 按需调整规则作用范围 .should() .notDeclareAnyThrowable();
- 若验证目标为保证方法运行时完全不会抛出任何异常:ArchUnit无法实现该需求。ArchUnit是基于字节码的静态架构校验工具,无法覆盖动态运行时的异常触发场景,比如空指针异常、数组越界异常这类隐式抛出的运行时异常,静态分析无法100%预判覆盖,这类校验需要依赖单元测试、集成测试等动态测试手段实现。
问题2:ArchUnit是否可以限制方法签名不声明抛出任何受检异常
可以实现。受检异常的定义为java.lang.Exception的子类且不属于java.lang.RuntimeException的子类,你可以通过ArchUnit的类型匹配规则实现对应校验,示例代码如下:
ArchRule methods_not_declare_checked_exceptions = methods() .that() .arePublic() // 按需调整要校验的方法范围,比如所有方法、仅业务方法等 .should() .notDeclareThrowableOfType( assignableTo(Exception.class) .and(not(assignableTo(RuntimeException.class))) );
如果需要同时禁止方法声明Error类型的抛出,额外扩展匹配规则即可。
内容的提问来源于stack exchange,提问作者jabrena
相关产品推荐
相关产品推荐

