От Wiki:
, поскольку они должны быть правильно построены, истинные документы XHTML позволяют, чтобы автоматизированная обработка была выполнена с помощью стандарта XML tools— в отличие от HTML, который требует относительно сложного, снисходительного, и обычно пользовательского синтаксического анализатора. XHTML может считаться пересечением HTML и XML во многих отношениях, так как это - переформулировка HTML в XML.
Наличие, которому HTML приспосабливает стандартам XML, позволяет, чтобы намного более последовательное анализировало страницы. Принимая во внимание, что в HTML, например, Вам разрешили иметь теги не в порядке test
теперь, Вы не можете, они должны быть закрыты в порядке, они были открыты. Вещи как это делают DOM, анализирующий (который теперь используется в большой степени в Ajax) очень легче.
Чистый обходной путь - использовать 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();
}
Украсьте исполняемый файл в другом исполняемом файле, который улавливает исключения времени выполнения и обрабатывает их:
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));
Почему бы не вызвать ExecutorService # submit ()
, получить обратно Future
, а затем самостоятельно обработать возможные исключения при вызове Future # get ( )
?
skaffman прав в том, что использование submit
является наиболее чистым подходом. Альтернативный подход - создать подкласс ThreadPoolExecutor
и переопределить afterExecute (Runnable, Throwable)
. Если вы следуете этому подходу, то обязательно вызовите execute (Runnable)
, а не submit (Runnable)
или afterExecute
не будет вызван.
Согласно описанию API:
Метод, вызываемый после завершения выполнение данного Runnable. Эта метод вызывается потоком, который выполнил задачу. Если не ноль, Метательный - это непойманный
RuntimeException
илиОшибка
, вызвавшая выполнение для внезапного прекращения.Примечание: когда действия заключены в задачи (например, FutureTask) либо явно или с помощью таких методов, как submit, эти объекты задачи улавливают и поддерживать вычислительные исключения и чтобы они не вызывали резких прекращение, а внутренний исключения не передаются этому метод .