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

Лучшие практики для ловли Throwable в Java

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

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

Еще одно предложение (полученное из комментария, а не ответ) состоит в том, чтобы всегда реконструировать ThreadDeath

Какие-либо другие рекомендации?

4b9b3361

Ответ 1

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

try {
  ...
} catch (IOException e) {
}

за исключением того, что вы намереваетесь. Иногда люди проглатывают проверенные исключения, потому что они не знают, что с ними делать или не хотят (или не могут) загрязнять свой интерфейс с помощью предложений "Броски исключений".

Если вы не знаете, что с ним делать, сделайте следующее:

try {
  ...
} catch (IOException e) {
  throw new RuntimeException(e);
}

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

FileInputStream in = null;
try {
  in = new FileInputStream(new File("..."));;
  // do stuff
} catch (IOException e) {
  // deal with it appropriately
} finally {
  if (in != null) try { in.close(); } catch (IOException e) { /* swallow this one */ }
}

Ответ 2

Зависит от того, над чем вы работаете.

если вы разрабатываете API, который будет использоваться кем-то другим, лучше повторить бросок Exception или обернуть его в свое собственное исключение и выбросить.

Если вы разрабатываете приложение enduser, вам нужно обработать это исключение и сделать нужное.

Ответ 3

Как насчет OutOfMemoryError (или, возможно, его супер класса VirtualMachineError)? Я не могу представить, что вы можете многое сделать после того, что серьезно.

Ответ 4

Если вы пишете очередь диспетчера, то к тому моменту, когда исключение вернется к вам, нет смысла ничего делать с ним, кроме как регистрировать его. Очередь событий Swing имеет в основном такой тип поведения.

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

Что касается InterruptedException: единственное, что вас беспокоит, это ваш цикл отправки, который должен проверять какое-то внешнее состояние, чтобы проверить, не прекратить ли его обработку.