Java force catch RuntimeException?

wun*_*tee 4 java exception-handling

是否有可能强制java让你捕获RuntimeExceptions?具体来说,我正在使用Spring框架,整个异常层次结构基于RuntimeExceptions.很多时候我忘记尝试捕捉异常.一个具体的例子是在进行LDAP查询或SQL调用时.

Esp*_*pen 7

不仅仅是Java.

但是如果使用AspectJ编译器进行编译或使用AspectJ加载时编织修改类,则可以.

维基百科的一个方面的定义:

一个方面是跨越其核心问题的计划的一部分

方面通常用于添加例如事务和安全逻辑.

为了演示方面如何解决您的问题,我创建了一个示例,该示例捕获从使用@Service注释标记的类中的方法内部调用集成层后抛出的所有异常.在这种情况下,包含.integration.在包名称中的类.

这只是一个例子.您可以修改它以捕获其他地方的RuntimeExceptions.例如,在名称中包含Facade并调用其他方法的类中的所有方法中.请参阅下面的图片以获取建议:

alt text http://files.espenberntsen.net/stackoverflow/call-to-integration-layer.png 橙色箭头是我用Eclipse中的AJDT插件说明的AspectJ切入点.这是您可以在AfterThrowing建议中捕获和处理运行时异常的地方.

以下是建议:

@AfterThrowing(value="serviceMethodAfterExpcetionFromIntegrationLayerPointcut()",     
     throwing="e")
public void serviceMethodAfterExceptionFromIntegrationLayer(JoinPoint joinPoint,
  RuntimeException e) {
  StringBuilder arguments = generateArgumentsString(joinPoint.getArgs());

  logger.error("Error in service " + joinPoint.getSignature()
  + " with the arguments: " + arguments, e);
  }
Run Code Online (Sandbox Code Playgroud)

我的serviceMethodAfterExpcetionFromIntegrationLayerPointcut实际包含两个其他的poincuts:

 @Pointcut("call(* *..integration.*.*(..))")
 public void integrationLayerPointcut() {}

 @Pointcut("within(@org.springframework.stereotype.Service *)")
 public void serviceBean() {}

 @Pointcut("serviceBean() && integrationLayerPointcut()")
 public void serviceMethodAfterExpcetionFromIntegrationLayerPointcut() {}
Run Code Online (Sandbox Code Playgroud)

简短概括,切入点查找标记有@Service注释的类中的所有位置,该注释调用集成层上的类中的方法.(见图中的橙色箭头)

如果要在测试类中捕获运行时异常,可以将切入点更改为:

@Pointcut("within(com.redpill.linpro.demo..*Test)")
public void inDemoProjectTestClass() {}
Run Code Online (Sandbox Code Playgroud)

然后,上面的建议将捕获在..demo包中以Test结尾的测试类中的所有异常.

有关@AspectJ样式的更多信息,请点击此处.

AspectJ与Spring完美集成.有关AspectJ的一般信息可以在这里找到,Spring的AspectJ支持在这里.


pol*_*nts 5

否:RuntimeException它的子类是未经检查的异常.

JLS 11.2.5为什么不检查运行时异常

运行时异常类(RuntimeException及其子类)从编译时检查,因为Java编程语言的设计者的判断,不必申报这种例外不会显著建立程序的正确性帮助豁免.Java编程语言的许多操作和构造都可能导致运行时异常.编译器可用的信息以及编译器执行的分析级别通常不足以确定不会发生此类运行时异常,即使这对程序员来说可能是显而易见的.要求声明这样的异常类只会让程序员感到恼火.

JLS 11.5异常层次结构

该类Exception是普通程序可能希望从中恢复的所有异常的超类.该类RuntimeException是类的子类Exception.子类RuntimeException未经检查的异常类.的子类Exception除了RuntimeException和它的子类都被检查的异常类.


Mat*_*hen 2

不会。从不检查 RuntimeException 的子类。