Вопрос по virtual-machine, exception, java – Асинхронные исключения Java: могу ли я их перехватить?

17

Я читал JLS, и я столкнулся с разделом11.1.3. Асинхронные исключения из которого я цитирую:

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

А также

Асинхронные исключения возникают только в результате:

[...]

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

Можно ли перехватывать такие исключения для целей регистрации или уведомления (потому что я считаю, что это невозможно исправить)? Как я могу достичь такой вещи?

Ваш Ответ

2   ответа
13

как и любое другое исключение. Единственная проблема заключается в том, что они могут возникнуть вЛюбые место в вашей программе, так что надежно поймать их трудно. Вы бы в основном должны были обернутьrun метод всех потоков и томуmain метод вtry..catch блокировать, но вы не можете сделать это для потоков, которые вы не контролируете (например, Swing EDT, или потоки для таймеров и т. д.).

Также ловит любой подклассError обычно не рекомендуется, потому что JVM может находиться в нестабильном состоянии, что может привести к дальнейшему отказу (например, в случаеOutOfMemoryError, у вас может даже не хватить памяти для обработки исключений). Тем не менее, регистрация будет веской причиной для ловлиErrorв моих глазах.

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

@Prasanth Конечно,try..catch может быть везде, где может быть нормальное утверждение, включая вложенныеtry, Конечно, вы также можете иметьtry..catch внутри другогоcatch например. Philipp Wendler
@MichaelTrouw В этом случае исключение, вероятно, было сгенерировано в тот момент, когда ваш поток не был внутри блока try. Philipp Wendler
И для любого интересно, еслиtry-catch блок может быть внутриtry блок, да, вы можете иметь это.Соответствующий код. Prasanth
Я не понимаю, как добавитьtry..catch Блок помогает ловить такие исключения. у меня есть такой случай, и добавив «внутренний»try--catch не помог мой случай. Не могли бы вы уточнить? @Prasanth @Philipp Wendler? Michael Trouw
@PhilippWendler Я только что узнал, что происходит во время отладки. Улов не был выполнен, потому что исключения были обработаны на более низком (библиотечном) уровне. Я уничтожил их, чтобы они всплыли, как и ожидалось, и, похоже, это не было асинхронной задачей. Хороший совет для новичков Java, исключения 102: проверьте, действительно ли выдается ожидаемое исключение! Michael Trouw
3

поскольку у вас нет никакой информации о том, в каком состоянии находится программа в этой точке, Документ говорит об ошибках виртуальной машины:

Реализация виртуальной машины Java выбрасывает объект, который является экземпляром подкласса класса VirtualMethodError, когда внутренняя ошибка или ограничение ресурса не позволяют ему реализовать семантику, описанную в этой главе.Эта спецификация не может предсказать, где могут возникнуть внутренние ошибки или ограничения ресурсов, и не определяет точно, когда о них можно сообщить..

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

Похожие вопросы