3

我目前在 Liferay 的一个项目中工作,我希望能够访问我的方法和参数,这些方法在历史记录中给出。这是在某些代码块中抛出异常的情况下完成的。

我已经搜索过并且很容易获得方法名称历史记录(Thread.currentThread().getStackTrace();),但我也想知道这些方法的参数是什么。

例如:

public class A {
    public static void main(String[] Args) {
        try {
            System.out.println(new B().someMethod(5));
        } catch (Exception e) {
            //GET HISTORY
        }
    }
}

public class B {
    public int someMethod(int i) throws Exception {
        i += 2;
        throw new Exception("Expected Exception to Generate History Search");
        return i;
    }
}

是否有可能在 A 类中学习如何在捕获异常时获取所有数据?所以,我该怎么做?

4

3 回答 3

1

您可以使用面向方面的编程。以AspectJ为例。

以下方面将在您的程序执行期间跟踪所有公共方法调用。这可以根据您自己的要求进行微调。例如,可以调整切入点以仅使用您自己的包。打印语句可以更改为使用一些日志框架。

public aspect Trace {
    pointcut publicMethodExecuted(): execution(public * *(..));

    after(): publicMethodExecuted() {
        System.out.printf("Enters on method: %s. \n", thisJoinPoint.getSignature());

        Object[] arguments = thisJoinPoint.getArgs();
        for (int i =0; i < arguments.length; i++){
            Object argument = arguments[i];
            if (argument != null){
                System.out.printf("With argument of type %s and value %s. \n", argument.getClass().toString(), argument);
            }
        }
        System.out.printf("Exits method: %s. \n", thisJoinPoint.getSignature());
    }
}
于 2012-09-21T10:28:08.747 回答
0

您应该考虑在您的应用程序中使用日志记录。

于 2012-09-21T10:23:36.067 回答
0

您绝对应该考虑登录您的应用程序。如果您想避免代码过于混乱(我个人讨厌log.debug(...)每个方法开始和结束时的常量语句),请考虑使用面向方面的编程(谷歌它以获得大量好的指南,或者有一个不错的 aop 指南在此处使用 Spring ,只需向下滚动到LoggingAspect),这将允许您简单地注释要记录的方法或整个类。

于 2012-09-21T10:27:14.100 回答