由于已检查异常,我们可能会在生产过程中遇到一些问题,所有异常都会在正确的位置捕获并正确记录。
我想知道是否有一些开源工具可以帮助审核这些问题。
例如,是否有一些AOP工具可以拦截所有抛出的异常并查看它们是否被重新抛出,包装或记录?这有助于识别不良捕获量。
答案 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());
}
}
有点重但它有效,现在如何捕获记录的异常和其他异常?