2013-11-20 2 views
0

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

Это работает, довольно хорошо.

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

Например, вот метод, который я вставил тестовый необработанное исключение:

/** 
* 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?

ответ

1

Чтобы ответить на ваш вопрос: Почему необработанное исключение, которое явно не выброшен в сигнатуру метода, не обрабатывается вызывающим абонентом, не врезаться в JVM?

Предполагая, что этот код работает в потоке, причина в том, что если вы не установили UnhandledExceptionHandler ни по типу Thread, ни по экземпляру Thread, то основная группа потоков по умолчанию - UnhandledExceptionHandler. По умолчанию группа потоков обрабатывает необработанные исключения, регистрируя трассировку стека на system.out, поток «умирает» и JVM не падает.

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

Как и другие плакаты, код должен очищать ресурсы, такие как каналы и сеанс, в блоке finally.

1

использовать, наконец, блок, чтобы обеспечить соединение закрыто.

public void closeConnection() { 
    try { 
     if (true) 
     throw new NullPointerException("Test unexpected exception NPE"); 
    } finally { 
     LOG.info("Closing SFTP connection"); 
     getSftpChannel().exit(); 
     getSession().disconnect(); 
     LOG.debug("SFTP Connection closed"); 
    } 
} 
+0

Может быть, я должен быть более ясным - NPE в этом примере предназначен только для тестирования ... у кода явно не просто новый NPE бросается без причины; -P - так что не имеет смысла поместите всю базу кода в блок try/finally – SnakeDoc

+0

, затем поместите вызов closeConnection в блок finally. – Slihp

+0

проблема в том, что * любое * необработанное исключение выбрано * где угодно * в базе кода, я получаю эту зависающую JVM. Не только в этом примере, а не только с примером NPE. – SnakeDoc

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