【问题标题】:React to any exception being thrown对抛出的任何异常做出反应
【发布时间】:2020-10-31 03:07:57
【问题描述】:

问题

我想对抛出异常的事件做出反应。所以如果有人写

throw new FooException();

系统应该通知我,以便我能够对该事件做出反应。

我还将接受建议解决此问题的框架或工具的答案,包括字节码操作。


详情

  • 它必须适用于任何异常;所以Exception 的子类,包括RuntimeException。我对Errors 不感兴趣。
  • 它还必须触发已捕获异常,无论它发生在代码库的哪个位置(包括 JDK 内部)。

如果有人这样做

try {
    foo();
} catch (FooException e) {
    ...
}

我也希望能够对此做出反应,而无需修改...的源代码。

因此,围绕主流程的 try-catch-em-all 不起作用,它不会捕获已捕获的异常。

Thread.setDefaultUncaughtExceptionhandler(...) 也一样,不会解决问题。


请不要建议调整我的设计,或者这可能是一个 XY 问题,我知道并且主要是问,因为我很好奇如何实现这一点。

【问题讨论】:

    标签: java exception hook throw


    【解决方案1】:

    面向方面的编程可以提供一个解决方案:基本上,它允许您在特定位置(称为“连接点”)“添加”代码片段(称为“建议”)

    例如,对于AspectJ,定义一个记录方法调用引发的每个异常的建议的代码可能看起来像这样(我还没有尝试过):

    @Aspect
    class ExceptionMonitoring {
    
        @AfterThrowing(pointcut = "call(* *.*(..))", throwing = "java.lang.Exception")
        public void logException(JoinPoint joinpoint, Exception exception) {
            System.out.println("The method " + joinpoint.getSignature().getName() + " threw " + exception);
        }
    }
    

    【讨论】:

      【解决方案2】:

      不完全确定这是否可行,但也许将处理程序创建为静态方法,以便您可以执行类似的操作

      ErrorHandler.handle(Class<ExceptionClass> clazz)

      并将该代码注入到类路径上可用的每个异常类构造函数中?您可以通过使用反射库扫描类路径来获取异常,然后尝试使用 javassist 或类似的东西对这些类进行字节码操作?

      这些东西应该在某个代理库中完成,您需要使用此代理库运行您的应用,以便在实际应用启动之前完成操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-16
        • 1970-01-01
        • 2012-02-04
        • 2013-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多