Подтвердить что ты не робот

Асинхронные исключения Java: могу ли я их поймать?

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

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

и

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

[...]

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Нет смысла улавливать эти исключения (подклассы VirtualMachineError), так как у вас нет дедикации, в которой состояние pogram находится в точке, Doc говорит о ошибках виртуальной машины:

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

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