JavaAspectJ例外越狱

JavaAspectJ例外越狱,java,exception-handling,aspectj,Java,Exception Handling,Aspectj,我有什么 我为一些特定的方法设置了一个连接点,以便能够测量它们的执行时间。我从不截取代码流中的任何内容(因此我们可以称之为“只读”类型的编织代码)。相应的代码如下所示: @Around("execution (* my.package.myclass..*(..)) && @annotation(my.another.package.Monitored)") public Object logExecutionTime(ProceedingJoinPoint joinPoint)

我有什么

我为一些特定的方法设置了一个连接点,以便能够测量它们的执行时间。我从不截取代码流中的任何内容(因此我们可以称之为“只读”类型的编织代码)。相应的代码如下所示:

@Around("execution (* my.package.myclass..*(..)) && @annotation(my.another.package.Monitored)")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
    Object returnObject = null;
    long startTime = System.currentTimeMillis();
    try {
        returnObject = joinPoint.proceed();
    } catch (Throwable throwable) {
        System.out.println("Intercepted exception " + throwable.getClass().getName() + ": " + throwable.getMessage());
        throw throwable; //<---- this does the jail-breaking
    } finally {
        long endTime = System.currentTimeMillis();
        long elapsedTime = endTime - startTime;
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        Monitored annotation = method.getAnnotation(Monitored.class);
        //do some more logic as logging etc.
    }
    return returnObject;
}
这意味着我可以优雅地处理该层中任何可能的异常,并且不允许将其抛出到上层

出了什么问题

如果应用程序代码没有抛出异常,那么就没有问题,所有逻辑都正常工作——时间被测量、记录和跟踪。但是,如果应用程序抛出异常,它将逃避我在上面发布的应用程序处理程序,并被抛出到上层

在调试器中,我看到它是由从我的aspected处理程序中抛出
throwable
的行完成的。这是我不明白的。显然,如果我从那里删除抛出异常,情况会变得更糟,因为现在实体将
null
,整个应用程序流将被破坏

问题


如何正确处理例外情况,以便在进行所有测量业务的同时记录它们发生的情况,并且不允许它们越狱?

正如对于Nándor一样,当我试图复制您的情况时,即使是LTW,它也适用于我。以下是一个独立的示例:

Java驱动程序应用程序:

package de.scrum\u master.app;
公共类应用程序{
公共静态void main(字符串[]args){
试一试{
新应用程序().doSomething();
}
捕获(可丢弃的t){
System.out.println(“捕获和处理的异常:+t”);
}
}
public void doSomething()引发InterruptedException{
睡眠(100);
抛出新的运行时异常(“Oops!”);
}
}
方面:

package de.scrum\u master.aspect;
导入java.lang.reflect.Method;
导入org.aspectj.lang.ProceedingJoinPoint;
导入org.aspectj.lang.annotation.Around;
导入org.aspectj.lang.annotation.Aspect;
导入org.aspectj.lang.annotation.Before;
导入org.aspectj.lang.reflect.MethodSignature;
@面貌
公共类RuntimeLogger{
@周围(“执行(!静态**(…)”)
公共对象logExecutionTime(ProceedingJoinPoint joinPoint)抛出可丢弃{
objectreturnobject=null;
long startTime=System.currentTimeMillis();
试一试{
returnObject=joinPoint.procedure();
}捕捉(可抛可抛){
System.out.println(“截获异常”+throwable.getClass().getName()+”:“+throwable.getMessage());

throw throwable;//我刚刚用您在这里描述的这个场景设置了一个小测试项目,异常并没有逃过我的应用程序级异常处理程序。您是否有可能在项目中使用Spring?@NándorElődFekete不,我使用的项目与您在这里描述的项目没有任何不同?因为对我来说,它是有效的应该如此。@NándorElődFekete有一件事我在这里没有提到(不确定是否相关):我使用运行时编织,因为我使用jar加载。异常是从加载的类中抛出的,因此它使用不同的类装入器(定义aspected类或充当异常监狱的类不同)这要视情况而定。类加载问题可能会产生非常奇怪的行为。你可能会得到同一个类的两个不同版本。你是在AspectJ和应用程序级异常处理程序中捕获可丢弃的<代码>吗?还是其他一些应用程序定义的异常类?谢谢,但我只有一个aspected类和一个h我会尽量准备最简单可行的演示项目(因为我正在做的是一个获得企业许可的项目)还有一件事你没有告诉我们。除非你提供一份复制问题的报告,否则没有人能帮助你。你是一个声誉很高的StackOverflow用户。我想知道为什么你从来没有跟进我的答案,我为此付出了一些努力。我真的很想(帮助你)找出哪里出了问题。因为“声誉很高”不会直接转化为“高知识”?我遵循了这一点-但不幸的是,正如你可能从我的活动中注意到的那样-由于我的工作量,我几乎没有时间:)顺便说一句,最后通过放置另一个异常处理程序来修复。我真的已经忘记了这个问题,谢谢你的提醒。如果我有时间-我将尝试用你提供的代码重现这个问题。P.S:I w对于一些我不怎么努力的答案(字面上是文档链接+一些简短的谈话),我得到了更多的选票,而对于一些我花了几天时间的答案,我得到了2..3票。我知道你的意思。说到高工作量,我是一名自由职业顾问(Scrum教练)我在2000年停止了软件开发赚钱。但我知道,如果你不在这里花很多时间的话,你不会在3.5年内获得28k的声誉,回答近800个问题。(-)无意冒犯,我很钦佩这一点。
try {
    //this is a monitored call:
    my.package.myclass.doStuff();
} catch (Throwable anyException) {
    //log stuff
    //& return default non-null entity
}