java - 防止 Java 中运行时异常退出循环

标签 java exception design-patterns

我有一项服务,我希望它具有以下行为:

  1. 如果服务收到 InterruptedException,或者 JVM 关闭,它应该尝试正常停止
  2. 如果发生一些“灾难性”事件,服务应该退出
  3. 应记录任何其他异常,应重置状态,并且循环应继续运行
  4. 循环不应在任何其他情况下退出。

所以这是我想出的一个过于简化的版本。

在类(class)层面:

private static volatile boolean keepRunning = true;

static {
    Runtime.getRuntime().addShutdownHook(new Thread() {
        @Override
        public void run() {
            keepRunning = false;
        }
    }); 
}

然后是循环:

while(keepRunning) {
    try {
        // Do something useful
        Thread.sleep(10000); // just an example of something that can cause InterruptedException 
    }
    catch(InterruptedException e) { 
        keepRunning = false;
    }
    catch(Exception e) { // catches all exceptions, but not any errors
        // log it
        // reset state
    }
}
if(!keepRunning) {
    // shut down gracefully
}

看起来满足了所有4个条件,但是有一些问题和不清楚的部分:

  1. (问题)捕获异常并且不做任何事情都是违反所有良好实践的。但在这种情况下可以接受吗,或者有更好的解决方案吗?
  2. (问题)我需要做的就是捕获Error来满足条件#2吗?或者还有其他我应该注意的情况吗?
  3. (不清楚)通常建议“正常关闭”代码在异常后进入 finally 部分,我真的不喜欢在循环后检查它( if(!keepRunning))。但在这种情况下,它似乎不适合 finally 。有更好的方法吗?
  4. (问题)此代码是为 Java 7 编写的。Java 8 会有什么改变/改进吗?

我会很高兴直接回答我的问题,或者指出不同的模式/解决方案。提前致谢。

最佳答案

在您的情况下捕获Exception是可以的。

如果您运行测试,不捕获错误是一个很好的做法。

finally block 是您应该用来优雅关闭的东西,是的 - finally block 中的 if 语句是必需的,而且通常是这样好的。

如果发生错误,您的 finally block 仍然会执行,所以一切都很好。

此代码适用于 Java 7 和 Java 8

关于java - 防止 Java 中运行时异常退出循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35539531/

相关文章:

java - JSP pageContext 空指针

c# - 如何避免在类之间传递上下文引用

c++ - 当对象作为基本类型传递时如何创建派生对象拷贝? C++

java - 将 android 库导出为 .jar 文件

java - Java中静态变量和最终静态变量之间的区别

java - 使用 DSC 安装 Windows 服务(所需状态配置)

oracle - 如何从 RAISED 异常中获取 oracle PL/SQL 中原始异常的堆栈跟踪?

java - 我在执行解密时遇到基数超出范围异常

java - try catch block 后引发异常

design-patterns - 构建向导 GUI 时应该使用哪些模式(下一步、返回、取消)