Audit Java: sistema para detectar exceções lançadas / capturadas (aop?)

Devido a exceções verificadas, podemos ter alguns problemas na produção, com todas as exceções capturadas no local correto e registradas corretamente.

Gostaria de saber se existe alguma ferramenta opensource para ajudar na auditoria desses problemas.

Por exemplo, existe alguma ferramenta AOP que interceptaria todas as exceções lançadas e veria se elas são lançadas, agrupadas ou registradas? Isso ajudaria a identificar as capturas ruins.

Eu sei que a pergunta pede uma solução de código aberto. Eu não sei de um, mas se a opção está lá, então o DynaTrace faz exatamente o que você quer. Boa sorte em sua pesquisa.

Se você decidiu que gostaria de seguir a rota AOP, o Spring Framework fornece uma estrutura AOP fácil de usar. Essencialmente, como grande parte do Spring, você usaria uma combinação de um arquivo de configuração xml e algum código java para definir a funcionalidade do AOP que você está procurando.

No seu caso, acredito que você estaria procurando definir um ‘After Throwing Advice’, no qual você, é claro, teria access à exceção lançada.

Um bom lugar para começar em termos de documentação é o capítulo AOP na documentação do Spring: http://static.springsource.org/spring/docs/2.5.x/reference/aop.html

Ah, e acredito que todos os projetos do Spring também são de código aberto =)

Existem ferramentas como FindBugs, PMD e Checkstyle, que podem identificar alguns problemas comuns de tratamento de exceções. Eu nunca vi uma ferramenta que analise especificamente o seu tratamento de exceções, se alguém souber que eu estarei interessado!

Eu tive essa pergunta exata, e eu tentei escrever algo eu mesmo, e devido ao proxy nested AOP e falta de capacidade de usar instrumenation / tecelagem, desisti e só fiz um grande encontrar e replace

Uma das ferramentas que eu encontrei naquela época era o software AppSight by BMC, mas o alto custo era um problema

O Inspector do IntelliJ pode verificar o código para muitos problemas à medida que você o escreve:

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

Mas seu problema parece mais sobre educação do que tecnologia. Você precisa instruir sua equipe sobre o que significa o tratamento adequado de exceções, quando isso deve ser feito, etc. As ferramentas ajudarão, mas não colocá-las no código é o primeiro lugar é melhor.

Usamos os aspectos de spring para nossos sistemas de produção para fazer log, rastreamento, cálculos de desempenho, etc. Antes, depois e exceções, maravilhas de trabalho de conselhos – eles mantêm o código em um único local e dão flexibilidade declarativa sobre onde eles são aplicados.

Apenas um aviso: os aspectos não são gratuitos. Eles adicionam custo a cada método em que você os aplica, portanto não os empilhe. Moderação em todas as coisas é a chave.

Eu não pensei nisso ainda, mas uma solução, se você não precisa detectar exceções lançadas no ambiente de produção , é append ao seu aplicativo Java um depurador personalizado que pode ser acionado sempre que uma exceção é levantada.

Este artigo do blog francês fala sobre como fazê-lo: http://blog.xebia.fr/2011/12/12/legacy-code-gestion-des-exceptions-avec-jpda/

Aqui está o código:

Executar com debugging: Xdebug -Xrunjdwp: transport = dt_socket, endereço = 8000, servidor = y, suspender = n

Conecte-se à 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 args = connector.defaultArguments(); Connector.Argument pidArgument = args.get("port"); pidArgument.setValue(port); return connector.attach(args); } 

Crie seus pontos de interrupção. Exemplo:

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

E, em seguida, manipule as exceções:

 public static void handleExceptionEvent(ExceptionEvent exceptionEvent) throws Exception { ObjectReference remoteException = exceptionEvent.exception(); ThreadReference thread = exceptionEvent.thread(); List paramList = new ArrayList(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()); } } 

Um pouco pesado, mas funciona, agora como pegar as exceções que estão registradas e as outras?