поймать исключение, не попадая в его блок try?

#java #exception

#java #исключение

Вопрос:

У меня интересная проблема. Мой блок кода приведен ниже. Проблема в том, что файл журнала не содержит строки «Подготовка к сну ..», но содержит строки «Резервный поток был прерван …». Мой вопрос: возможно ли поймать исключение, не попадая в его блок try?

 long sleepTime = runtime.getTimeInMillis() - Calendar.getInstance().getTimeInMillis();

try {
    log("Getting ready to sleep...("   sleepTime   ")");

    Thread.sleep(sleepTime);

    Database db = new Database();
    log(db.performDatabaseBackup());

    // Set it to run the next day.
    runtime.add(Calendar.DATE, 1);

  } catch (InterruptedException ie) {
    log("Backup thread was interrupted...");
}
  

Редактировать: метод журнала

   private void log(String message) {
                   Logger.debug(this, message);
}
  

и Logger.debug

 public static void debug(
      Object obj,
      String message ){
      debug( obj.getClass(), message );
      }


    public static void debug(
      String className,
      String message )
   {
      try
      {
         Class inputClass = Class.forName( className );
         debug( inputClass, message );
      }
      catch ( ClassNotFoundException e )
      {
         debug( ( Class )null, message );
      }
   }
  

Комментарии:

1. Короткий ответ: нет. Там должно быть что-то еще на работе. Я рекомендую попробовать удаленный отладчик.

Ответ №1:

Нет, невозможно перехватить исключение, не выданное во время выполнения его try блока. Возможные ситуации:

  1. InterruptedException выдается перед входом "Getting ready..." в систему, т.Е. в вашем log(...) вызове. (маловероятно)

  2. Метод Log работает не так, как ожидалось, и не регистрирует вашу строку. (вероятно) Можете ли вы проверить, выполняется ли режим ожидания, установив высокое время ожидания. Это подразумевало бы эту причину.

  3. У вас есть другие фрагменты протоколирования кода "Backup thread was interrupted..." , которые вызывают вывод журнала, и представленный фрагмент кода вообще не выполняется.

Ответ №2:

Я предполагаю, что метод log не работает должным образом? Я не верю, что блок catch можно ввести без ввода блока try. Другой альтернативой является то, что метод log вызывает исключение InterruptedException?

Можете ли вы также опубликовать свой метод ведения журнала?

Ответ №3:

Если вы вводите catch блок, внутри блока генерируется исключение try . Точка.

Чтобы решить вашу проблему: распечатайте трассировку стека исключения и посмотрите, не вызывает ли log() он также некоторые исключения.