java - 为什么我的 `main()` 没有捕获在 junit 测试中 `timer` 中抛出的异常?

标签 java exception junit runtimeexception error-code

这是我的主要方法:

public static void main(String... args) throws ClassNotFoundException {
    String[] classAndMethod = args[0].split("#");
    if (helpCmd(args)) {
        printHelpForTest(classAndMethod[1]);
        System.exit(0);
    }

    Result result = runTest(classAndMethod);
    exitIfTimeOutExceptionThrown(result);
    System.exit(result.wasSuccessful() ? 0 : 1);
}

private static void exitIfTimeOutExceptionThrown(Result result) {
    boolean isTimeOut = Iterables.filter(result.getFailures(), CodeBlockTimeOutException.class).iterator().hasNext();
    if (isTimeOut)
    {
        System.exit(2);
    }
}

运行这个 junit 测试:

    @Test
    public void sendSearchRequest() throws Exception {

...

        setTimeOut();

...
    }

private void setTimeOut() {
    if (criticalBlockTimeOut != null) {
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                throw new CodeBlockTimeOutException();
                //thread.interrupt();

            }
        };
        new Timer().schedule(timerTask, Long.parseLong(criticalBlockTimeOut));
    }
}

为什么我看到我的代码抛出 CodeBlockTimeOutException 但它不会以代码 2 退出?

我怎样才能把它扔到主线程中?

最佳答案

计时器事件发生在另一个线程中。主线程退出没有错误。错误是从另一个记录的。如果出现异常,您应该从计划的作业中设置一些 volatile 标志。等待作业在主线程中完成,然后检查此标志。

看看这里:Waiting for a Timer to finish in JavaJava: Wait for TimerTask to complete before continuing execution

关于java - 为什么我的 `main()` 没有捕获在 junit 测试中 `timer` 中抛出的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27486932/

相关文章:

java - 将 jsf 项目转换为 Facelets 2.0 时出现的问题

java - 为什么类型不兼容?

android - 如何使用 Kotlin 协程为 Android 单元测试注入(inject) viewModelScope?

C++ 有单独的可执行日志异常吗?

java - 如何检查 jdbc 连接和 dbbool 连接是否达到最大值?

java - 如何测试jdbi BinderFactory

java - 如何使 JPA 列仅在 JUnit 测试期间可插入?

java - 如何实现SpringRetry

java - eclipse 重构插件

haskell - 用于文件处理的多个异常处理程序