Audit Java:检测抛出/捕获异常的系统(aop?)

时间:2010-12-09 14:15:12

标签: java exception logging java-ee aop

由于已检查异常,我们可能会在生产过程中遇到一些问题,所有异常都会在正确的位置捕获并正确记录。

我想知道是否有一些开源工具可以帮助审核这些问题。

例如,是否有一些AOP工具可以拦截所有抛出的异常并查看它们是否被重新抛出,包装或记录?这有助于识别不良捕获量。

6 个答案:

答案 0 :(得分:4)

如果您决定采用AOP路由,Spring Framework提供了一个易于使用的AOP框架。从本质上讲,与Spring的大部分内容一样,您将使用xml配置文件和一些Java代码的组合来定义您正在寻找的AOP功能。

在你的情况下,我相信你会想要定义一个'After Throwing Advice',你当然可以访问抛出的异常。

从文档方面入手的一个好地方是Spring文档中的AOP章节: http://static.springsource.org/spring/docs/2.5.x/reference/aop.html

哦,我相信所有Spring项目都是开源的=)

答案 1 :(得分:2)

FindBugs,PMD和Checkstyle等工具可以识别一些常见的异常处理问题。我从来没有见过专门分析你的异常处理的工具,如果有人知道我会感兴趣的话!

答案 2 :(得分:2)

我知道这个问题需要一个开源解决方案。我不知道一个,但如果有选项,那么DynaTrace 完全你想要什么。祝你的搜索顺利。

答案 3 :(得分:1)

我有这个确切的问题,我试图自己写一些东西,由于AOP嵌套代理和缺乏使用仪器/编织的能力,我放弃了,只是做了一个广泛的发现和替换

我当时找到的其中一个工具是BMC软件的AppSight,但它的成本很高是一个问题

答案 4 :(得分:1)

IntelliJ的Inspector可以在编写代码时检查许多问题:

http://www.jetbrains.com/idea/documentation/inspections.jsp

但你的问题听起来更像是教育而不是技术。您需要教育您的团队,了解适当的异常处理方式,何时应该完成等等。工具将有所帮助,但不是将它们放入代码中是第一个更好的。

我们使用Spring方面为我们的生产系统进行日志记录,跟踪,性能计算等。之前,之后和异常建议工作奇迹 - 他们将代码保存在一个地方,并提供声明灵活性,以确定它们的应用位置。

只需谨慎一点:方面不是免费的。它们会为您应用它们的每种方法增加成本,因此不要只是将它们堆积起来。所有事情的适度是关键。

答案 5 :(得分:0)

我还没有解决这个问题,但只有一个解决方案,如果你不需要检测生产环境中抛出的异常,就是在Java应用程序中附加一个可以随时触发的自定义调试器提出了一个例外。

这篇法国博客文章谈到了如何做到这一点: http://blog.xebia.fr/2011/12/12/legacy-code-gestion-des-exceptions-avec-jpda/

以下是代码:

使用debug运行: Xdebug -Xrunjdwp:transport = dt_socket,address = 8000,server = y,suspend = n

连接到JVM:

public static VirtualMachine connect(String port) throws IOException, IllegalConnectorArgumentsException {
        AttachingConnector connector = null;
        VirtualMachineManager vmManager = Bootstrap.virtualMachineManager();
        for (Connector aconnector : vmManager.allConnectors()) {
            if ("com.sun.jdi.SocketAttach".equals(aconnector.name())) {
  connector = (AttachingConnector) aconnector;
  break;
     }
 }
 Map<String, Connector.Argument> args = connector.defaultArguments();
        Connector.Argument pidArgument = args.get("port");
        pidArgument.setValue(port);
        return connector.attach(args);
 }

创建断点。例:

public static void createExceptionBreakPoint(VirtualMachine vm) {
        EventRequestManager erm = vm.eventRequestManager();
        List<ReferenceType> referenceTypes = vm.classesByName("java.lang.Throwable");
        for (ReferenceType refType : referenceTypes){
  ExceptionRequest exceptionRequest = erm.createExceptionRequest(refType, true, true);
  exceptionRequest.setEnabled(true);
 }
}

然后处理异常:

public static void handleExceptionEvent(ExceptionEvent exceptionEvent) throws Exception {
        ObjectReference remoteException = exceptionEvent.exception();
        ThreadReference thread = exceptionEvent.thread();
        List<Value> paramList = new ArrayList<Value>(1);
        paramList.add(dumpFileName);
        //crer un printStream dans la JVM cible
        ObjectReference printStreamRef = printStreamClassType.newInstance(thread, printStreamConstructor, paramList,
            ObjectReference.INVOKE_SINGLE_THREADED);
    ReferenceType remoteType = remoteException.referenceType();
    Method printStackTrace = (Method) remoteType.methodsByName("printStackTrace").get(1);
    paramList.clear();
    paramList.add(printStreamRef);
    remoteException.invokeMethod(thread, printStackTrace, paramList, ObjectReference.INVOKE_SINGLE_THREADED);
    Scanner scanner = new Scanner(new File(dumpFileName.value()));
    while (scanner.hasNextLine()){
  System.out.println(scanner.nextLine());
 }
}

有点重但它有效,现在如何捕获记录的异常和其他异常?