Как правильно поймать RuntimeExceptions от Исполнителей?

От Wiki:

, поскольку они должны быть правильно построены, истинные документы XHTML позволяют, чтобы автоматизированная обработка была выполнена с помощью стандарта XML tools— в отличие от HTML, который требует относительно сложного, снисходительного, и обычно пользовательского синтаксического анализатора. XHTML может считаться пересечением HTML и XML во многих отношениях, так как это - переформулировка HTML в XML.

Наличие, которому HTML приспосабливает стандартам XML, позволяет, чтобы намного более последовательное анализировало страницы. Принимая во внимание, что в HTML, например, Вам разрешили иметь теги не в порядке test теперь, Вы не можете, они должны быть закрыты в порядке, они были открыты. Вещи как это делают DOM, анализирующий (который теперь используется в большой степени в Ajax) очень легче.

43
задан Joonas Pulakka 6 November 2009 в 14:42
поделиться

4 ответа

Чистый обходной путь - использовать ExecutorService.submit () вместо execute () . Это возвращает вам Future , которое вы можете использовать для получения результата или исключения задачи:

ExecutorService executor = Executors.newSingleThreadExecutor();
Runnable task = new Runnable() {
  public void run() {
    throw new RuntimeException("foo");
  }
};

Future<?> future = executor.submit(task);
try {
  future.get();
} catch (ExecutionException e) {
  Exception rootException = e.getCause();
}
56
ответ дан 26 November 2019 в 22:51
поделиться

Украсьте исполняемый файл в другом исполняемом файле, который улавливает исключения времени выполнения и обрабатывает их:

public class REHandler implements Runnable {
    Runnable delegate;
    public REHandler (Runnable delegate) {
        this.delegate = delegate;
    }
    public void run () {
        try {
            delegate.run ();
        } catch (RuntimeException e) {
            ... your fancy error handling here ...
        }
    }
}

executor.execute(new REHandler (myRunnable));
10
ответ дан 26 November 2019 в 22:51
поделиться

Почему бы не вызвать ExecutorService # submit () , получить обратно Future , а затем самостоятельно обработать возможные исключения при вызове Future # get ( ) ?

9
ответ дан 26 November 2019 в 22:51
поделиться

skaffman прав в том, что использование submit является наиболее чистым подходом. Альтернативный подход - создать подкласс ThreadPoolExecutor и переопределить afterExecute (Runnable, Throwable) . Если вы следуете этому подходу, то обязательно вызовите execute (Runnable) , а не submit (Runnable) или afterExecute не будет вызван.

Согласно описанию API:

Метод, вызываемый после завершения выполнение данного Runnable. Эта метод вызывается потоком, который выполнил задачу. Если не ноль, Метательный - это непойманный RuntimeException или Ошибка , вызвавшая выполнение для внезапного прекращения.

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

6
ответ дан 26 November 2019 в 22:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: