Как записывать журналы сбоев в Java - PullRequest
2 голосов
/ 15 сентября 2008

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

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

Ответы [ 3 ]

4 голосов
/ 15 сентября 2008

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

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

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

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

3 голосов
/ 15 сентября 2008

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

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

1 голос
/ 15 сентября 2008

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

...