2010-12-09 4 views
15

Из-за отмеченных исключений мы можем иметь некоторые проблемы в производстве, имеющие все исключения, попавшие в нужное место и правильно зарегистрированные.Аудит Java: система обнаружения исключений, брошенных/пойманных (aop?)

Удивительно, есть ли какой-нибудь инструмент с открытым исходным кодом, который поможет в проверке этих проблем.

Например, есть ли какой-нибудь инструмент AOP, который перехватит все выброшенные исключения и посмотрит, будут ли они перезагружены, завернуты или зарегистрированы? Это поможет выявить плохие уловы.

+0

эй никто не знает? :) – 2010-12-15 16:04:24

+0

У вас есть модульные тесты с хорошим покрытием кода? – pstanton 2010-12-18 21:15:59

ответ

2

Я знаю, вопрос требует решения с открытым исходным кодом. Я не знаю одного, но если опция есть, то DynaTrace делает точно что вы хотите. Удачи вам в поиске.

2

Существуют такие инструменты, как FindBugs, PMD и Checkstyle, которые могут идентифицировать некоторые распространенные проблемы с обработкой исключений. Я никогда не видел инструмент, который специально анализирует вашу обработку исключений, если кто-нибудь знает, что мне будет интересно!

4

Если вы решили, что хотите воспользоваться маршрутом AOP, Spring Framework обеспечивает простую в использовании структуру AOP. По сути, как и большая часть Spring, вы должны использовать комбинацию xml-конфигурационного файла и некоторого java-кода для определения функций AOP, которые вы ищете.

В вашем случае, я считаю, вы бы хотели определить «После броска», в котором вы, конечно, имеете доступ к исключенному.

Хорошее место, чтобы начать с точки зрения документации АОП Глава в Весенних документы: http://static.springsource.org/spring/docs/2.5.x/reference/aop.html

О, и я считаю, что все пружинные проекты с открытым исходным кодом, а =)

1

Я имел этот точный вопрос, и я пытался написать что-то само, и из-за АОП вложенного проксирования и отсутствие возможности использовать instrumenation/сотку, я сдался и просто широкий поиск и замена

One Хэ инструментов я нашел тогда для был AppSight программным обеспечением BMC, но это высокая стоимость была проблема

1

инспектор IntelliJ может проверить код для многих проблем, как вы пишете:

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

Но ваша проблема звучит, как будто это больше, чем образование. Вам нужно обучить свою команду тому, что означает правильная обработка исключений, когда это нужно сделать, и т. Д. Инструменты помогут, но не вставлять их в код, на первом месте лучше.

Мы используем весенние аспекты для наших производственных систем для ведения журналов, отслеживания, расчетов производительности и т. Д. Рекомендации до, после и исключения помогают творить чудеса - они сохраняют код в одном месте и дают декларативную гибкость в отношении того, где они применяются ,

Только одно предостережение: аспекты не являются бесплатными. Они добавляют стоимость каждого метода, к которому вы их применяете, поэтому не просто накапливайте их. Модерация во всех отношениях - это ключ.

0

Я не хотя об этом, но еще одно решение, если вы не нужно определить исключения, по производству envirionment, чтобы прикрепить к приложению Java пользовательский отладчик, который может быть вызван всякий раз, когда возникает исключение ,

Этой французский блог статья говорит о том, как это сделать: http://blog.xebia.fr/2011/12/12/legacy-code-gestion-des-exceptions-avec-jpda/

Вот код:

Запуск с отладкой: Xdebug -Xrunjdwp: транспорт = транспорт по сокетам, адрес = 8000, сервер = у , приостановить = п

Подключения к виртуальной машине Java:

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); 
} 

Создание точки останова. Exemple:

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()); 
} 
} 

немного тяжеловат, но это работает, теперь, как перехватывать исключения, которые регистрируются и другие?

Смежные вопросы