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

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

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

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

Ответы

Ответ 1

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

Ответ 2

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

В вашем случае, я считаю, вы бы хотели определить "After Throwing Advice", в котором у вас, конечно же, был бы доступ к выведенному исключению.

Хорошим местом для начала работы с документацией является глава AOP в документах Spring: http://static.springsource.org/spring/docs/2.5.x/reference/aop.html

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

Ответ 3

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

Ответ 4

У меня был этот точный вопрос, и я попытался написать что-то сам, и из-за вложенного прокси-сервера AOP и отсутствия возможности использовать инкрустацию/плетение, я сдался и просто сделал широкую находку и заменил

Один из инструментов, который я нашел тогда, был AppSight с помощью программного обеспечения BMC, но высокая стоимость была проблемой

Ответ 5

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

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

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

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

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

Ответ 6

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

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

Вот код:

Запуск с отладкой: 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);
 }

Создайте свои контрольные точки. 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());
 }
}

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