Лучшие практики для ловли Throwable в Java
Иногда вам просто нужно поймать Throwable, например. при написании очереди диспетчера, которая отправляет общие элементы и нуждается в восстановлении от любых ошибок (упомянутый диспетчер регистрирует все обнаруженные исключения, но молча, а затем выполнение продолжается по другим элементам).
Одна из лучших практик, о которых я могу думать, заключается в том, чтобы всегда реконструировать исключение, если это InterruptedException, потому что это означает, что кто-то прервал мой поток и хочет его убить.
Еще одно предложение (полученное из комментария, а не ответ) состоит в том, чтобы всегда реконструировать ThreadDeath
Какие-либо другие рекомендации?
Ответы
Ответ 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: единственное, что вас беспокоит, это ваш цикл отправки, который должен проверять какое-то внешнее состояние, чтобы проверить, не прекратить ли его обработку.