2013-08-28 2 views
1

Я знаю, что Error - Throwable (поэтому его можно обрабатывать), и обработка Error не самая лучшая практика, но предположим, что у нас есть требование поймать все Error.Можно ли обрабатывать все ошибки на Java?

Можно вообще? Я имею в виду, что о ошибках, которые могут появляться в потоках демонов? Они будут разбивать jvm, и я не буду знать об этом.

И могу ли я пропустить Error, даже если я окружаю основной (String ... args) с try-catch?

ответ

5

Вы можете поймать пойманные исключения через Thread.setUncaughtExceptionHandler()

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

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

Хорошая идея - это другой вопрос (!). Возможно, вы просто хотите очистить ресурсы, отключить подключения и т. Д., Зарегистрировать проблему и/или предупредить пользователя. Если у вас есть критические проблемы, такие как OutOfMemoryErrors, тогда вы еще ничего не можете сделать.

0

Вы можете обрабатывать исключения, но вы не можете обрабатывать ошибки.

1

Ошибка является подклассом Throwable, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться поймать. Большинство таких ошибок являются ненормальными условиями.

Теперь, так как ошибка действительно расширяет метательную, можно поймать «любую» ошибку с помощью простого заявления примерки улова следующим образом:

try{ 
    //Error causing code here... 
}catch(Error e){ 
    //Handle error here... 
} 

Однако, поскольку ошибки в различных формах, заброшенная ошибка может сопровождаться изменением поведения jvm или может не сопровождаться его непредвиденными результатами.

Рассмотрите ошибку OutOfMemoryError. Когда эта ошибка выбрасывается, куча JVM может быть настолько полной, что любой тип кода обработки приводит к выбросу другого OutOfMemoryError, аннулируя любую попытку восстановления.

Кроме того, даже при работе в «первичной» нити (той, в которой запускается приложение), ошибка может привести к сбою JVM перед каждым сбросом ошибки.

Глядя на описание VirtualMachineError (из которых ошибки, такие как OutOfMemoryError, StackOverflowError, InternalError и т.д. являются подклассами) мы видим:

Брошенный, чтобы указать, что виртуальная машина Java сломаны или закончились ресурсов, необходимых для продолжения работы.

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

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

Теперь все ошибки могут быть обработаны? Теоретически, да, если мы предположим, что JVM может продолжать работать отлично, несмотря на то, что утверждается, что он провалился фатально ... При этом обрабатывается практически только небольшое количество ошибок. Являются ли это небольшое подмножество ошибок следует обращаться также весьма спорная тема.

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