У меня есть приложение, которое работает без головок и должно быть способно уведомлять администраторов о проблемах. Я построил для него систему уведомлений по электронной почте, и в основном, если исключение выбрано и поймано, в зависимости от области кода и критичности исключения, оно может быть передано в структуру уведомлений о предупреждениях, которая запускает электронное письмо для выхода к перечисленным администраторам с трассировкой стека и другой информацией об отладке.Застрявшая нить после бросания необработанного исключения
Это работает, довольно хорошо.
Перед тем, как приступить к развертыванию, я прошел через его шаги. Один из моих тестов - это бросить необработанное исключение из случайного пятна в коде, - имитируя потенциально серьезную проблему времени выполнения, когда возникают исключения, которых мы не ожидали.
Например, вот метод, который я вставил тестовый необработанное исключение:
/**
* Closes connection.
*/
public void closeConnection() {
if (true)
throw new NullPointerException("Test unexpected exception NPE");
LOG.info("Closing SFTP connection");
getSftpChannel().exit();
getSession().disconnect();
LOG.debug("SFTP Connection closed");
}
код работает, и когда он попадает в эту необработанное исключение, программа hardlocks (так как исключение и подключение SFTP нить никогда не закрывается, поэтому он удерживает jvm открытым до истечения времени соединения).
Я думал, что это разрушит JVM или передаст его его вызывающему абоненту, который в конечном итоге перейдет в систему оповещения.
В этом случае я предположил, что этот NPE выбрасывает из этого исключения, не обрабатывается его вызывающим абонентом или вызывающим абонентом и т. Д., Поэтому он должен пузыриться на main(), а затем сбрасывать JVM, поскольку даже главный не поймает Exception
или NPE.
Question
: Что здесь происходит и как я могу обеспечить, чтобы такой сценарий не зависел на производстве? У меня только что было огромное предложение catch-all catch для моего основного() и уловить ли он все Exception
, чтобы обработать каждое исключение?
EDIT FOR CLARITY:
вопрос более или менее - Why does an unhandled exception that is not explicitly thrown in a method's signature, nor handled by a caller, not crash the JVM?
Может быть, я должен быть более ясным - NPE в этом примере предназначен только для тестирования ... у кода явно не просто новый NPE бросается без причины; -P - так что не имеет смысла поместите всю базу кода в блок try/finally – SnakeDoc
, затем поместите вызов closeConnection в блок finally. – Slihp
проблема в том, что * любое * необработанное исключение выбрано * где угодно * в базе кода, я получаю эту зависающую JVM. Не только в этом примере, а не только с примером NPE. – SnakeDoc