Как записывать журналы сбоев в Java

Я работаю над кросс-платформенным приложением на Java, которое в настоящее время прекрасно работает в Windows, Linux и MacOS X. Я пытаюсь найти хороший способ обнаружения (и обработки) «сбоев». Есть ли простой кросс-платформенный способ обнаружения «сбоев» в Java и что-то делать в ответ?

Думаю, под «сбоями» я подразумеваю неперехваченные исключения. Однако в коде используется некоторый JNI, поэтому было бы неплохо иметь возможность отлавливать сбои из-за плохого кода JNI, но у меня есть ощущение, что это специфично для JVM.


person Free Wildebeest    schedule 14.09.2008    source источник


Ответы (3)


Для простой комплексной обработки вы можете использовать следующий статический метод в Тема. Из Javadoc:

static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
Установите обработчик по умолчанию, вызываемый, когда поток внезапно завершается из-за неперехваченного исключения, и для этого потока не определен другой обработчик.

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

Примечание. Лучше, если код сможет перехватывать, регистрировать и/или восстанавливать исключения ближе к источнику проблемы. Я бы зарезервировал этот вид обобщенной обработки сбоев для полностью неустранимых ситуаций (т. е. подклассов java.lang.Error). Старайтесь избегать возможности RuntimeException когда-нибудь останется совершенно незамеченным, поскольку для программного обеспечения может быть возможно — и предпочтительнее — пережить это.

person David Crow    schedule 15.09.2008

Для обработки неперехваченных исключений вы можете предоставить новую группу ThreadGroup, которая обеспечивает реализацию ThreadGroup.uncaughtException(...). Затем вы можете перехватывать любые неперехваченные исключения и обрабатывать их соответствующим образом (например, отправлять журнал сбоев домой).

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

person Free Wildebeest    schedule 14.09.2008

Не уверен, что это то, что вам нужно, но вы также можете определить, произошло ли исключение из вашего собственного кода. См. http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp5234 для получения дополнительной информации.

person Evan    schedule 14.09.2008
comment
Это полезно знать, поскольку я вызываю код Java из собственного кода, поэтому он добавит точки, в которых я могу обрабатывать неожиданные исключения/сбои. Похоже, мне придется раскидать код несколькими проверками на сбои, используя такой код. - person Free Wildebeest; 15.09.2008