Как использовать обработчика необработанных исключений для теста мультипотока в junit?

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

public class UncaughtExceptionTest extends TestCase
    implements UncaughtExceptionHandler {

    private final List<Throwable> uncaughtExceptions =
        new CopyOnWriteArrayList<Throwable>();

    class UncaughtExceptionTestInnerClass implements Runnable {
        private final ScheduledThreadPoolExecutor executor =
            new ScheduledThreadPoolExecutor(1);
        private final CountDownLatch latch;

        UncaughtExceptionTestInnerClass(CountDownLatch latch) {
            this.latch = latch;
            executor.schedule(this, 50, TimeUnit.MILLISECONDS);
        }

        @Override
        public void run() {
            System.out.println("This is printed");
            fail("this should fail");
            latch.countDown();
        }
    }

    @Test
    public void testUncaughtExceptions() {
        Thread.setDefaultUncaughtExceptionHandler(this);
        CountDownLatch latch = new CountDownLatch(1);
        UncaughtExceptionTestInnerClass testTheInnerClass =
                new UncaughtExceptionTestInnerClass(latch);
        try {
            if (!latch.await(1, TimeUnit.SECONDS)) {
                if (uncaughtExceptions.size() > 0) {
                    Throwable exception = uncaughtExceptions.get(0);
                    System.out.println("First uncaught exception: " + 
                                    exception.getMessage());
                }
                else {
                    fail("this should not be reached");
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void uncaughtException(Thread t, Throwable e) {
        uncaughtExceptions.add(e);
    }
}
7
задан BD at Rivenhill 2 July 2010 в 03:40
поделиться

1 ответ

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

В зависимости от того, как вы отправляете задачи, поток-исполнитель может перехватить все Throwables и обработать их. Следовательно, поток не завершается из-за этих исключений, и, таким образом, обработчик неперехваченных исключений не участвует. Например, ThreadPoolExecutor.execute (Runnable) вызовет обработчик неперехваченных исключений. Однако ThreadPoolExecutor.submit (Callable) этого не делает. Кроме того, ScheduledThreadPoolExecutor.schedule () тоже не работает (это связано с использованием FutureTask для реализации).

Лучший способ доступа к неожиданным исключениям с помощью службы-исполнителя - через Future .

12
ответ дан 6 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

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