Аудит Java: система для обнаружения сгенерированных / пойманных исключений (aop?) - PullRequest
15 голосов
/ 09 декабря 2010

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

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

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

Ответы [ 6 ]

4 голосов
/ 09 декабря 2010

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

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

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

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

2 голосов
/ 16 декабря 2010

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

2 голосов
/ 09 декабря 2010

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

1 голос
/ 19 декабря 2010

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

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

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

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

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

1 голос
/ 18 декабря 2010

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

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

0 голосов
/ 14 декабря 2011

Я пока не думал об этом, но одно решение, если вам не нужно обнаруживать исключения, возникающие в производственной среде , - это подключить к вашему 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());
 }
}

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

...