использовать catch throwable или catch Exception в новом потоке выполнения - PullRequest
3 голосов
/ 19 апреля 2011

Мне нужно найти лучшие практики для try-catch при запуске нового потока.

Лично я предпочитаю вариант 2.

Какой вариант является лучшим?Существуют ли какие-либо факторы, которые могут сделать один из вариантов лучшим вариантом в некоторых ситуациях, а не в других?

Вариант 1

public void run(){
  try{
     //do something
   }catch(Exception e){
     // log 
   }
}

Вариант 2

public void run(){
  try{
     //do something
   }catch(Throwable t){
     // log
    }
}

РЕДАКТИРОВАТЬ: Предполагатьчто вы пишете код, который должен соответствовать строгой проверке кода.РЕДАКТИРОВАТЬ 2: Я знаю разницу между двумя вышеупомянутыми вариантами.Мне просто любопытно, что другие считают «100% правильными».

Ответы [ 4 ]

4 голосов
/ 19 апреля 2011

В корневом обработчике исключений, который просто регистрирует все, что пошло не так, различать Error и Exception бессмысленно, поэтому перехват Throwable вполне приемлем.

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

Следовательно, это зависит от того, какой обработчик исключений вы пишете.

3 голосов
/ 19 апреля 2011

Я бы использовал setDefaultUncaughtExceptionHandler (...) в потоке, чтобы перехватить то, что исполняемый файл не обрабатывает должным образом, но когда дело доходит до самого запускаемого объекта, это действительно зависит от того, чего он должен достичь, и разумно ожидать, учитывая разумныйконтекст исполнения.

С другой стороны, создание отдельного потока для выполнения исполняемого файла не является хорошей стратегией ИМХО, FutureTask лучше решает эти проблемы.

1 голос
/ 20 апреля 2011

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

ЕслиВ вашем проекте есть политика регистрации всех исключений / ошибок и запрета печати чего-либо со стандартной ошибкой. Возможно, вы захотите использовать UncaughtExceptionHandler .

. В общем случае рекомендуется пойматьтолько экземпляры RuntimeException.

public void run(){
  try{
     //do something
   }catch(RuntimeException e){
     // log 
   }
}

Catching Exception является слишком общим, поскольку язык Java требует, чтобы программы имели дело с проверенными исключениями.Улавливая даже проверенные исключения на вашем барьере ошибок, вы позволяете коду в блоке //do something быть неаккуратным и не обрабатывать проверенные исключения.

Перехват Error или Throwable также обычно считается плохой практикойпоскольку ошибка обычно указывает на то, что JVM находится в состоянии, в котором она не может продолжать полноценно функционировать.

Вот хорошая (и несколько уместная) статья по обработке исключений: http://www.oracle.com/technetwork/articles/entarch/effective-exceptions-092345.html

1 голос
/ 19 апреля 2011

Никогда не рекомендуется перехватывать Throwable, поскольку это включает в себя ошибки, которые невозможно обработать или избежать, такие как нехватка памяти и т.Таким образом, обычно гораздо лучше ловить Exception, а не ловить Throwable.Иногда это неизбежно, например, при вызове метода invoke или других методов отражения.

...