ScriptEngineManager 格外谨慎的异常处理

ScriptEngineManager extra cautious exception handling

我想咨询 JDK 代码异常处理,

在第 120 行的 ScriptEngineManager 中,ServiceConfigurationError 有未使用的辅助捕获,据我所知不能抛出

   try {
        while (itr.hasNext()) {
            try {
                ScriptEngineFactory fact = (ScriptEngineFactory) itr.next();
                facList.add(fact);
            } catch (ServiceConfigurationError err) {
                System.err.println("ScriptEngineManager providers.next(): "
                             + err.getMessage());
                if (DEBUG) {
                    err.printStackTrace();
                }
                // one factory failed, but check other factories...
                continue;
            }
        }
    } catch (ServiceConfigurationError err) {
        System.err.println("ScriptEngineManager providers.hasNext(): "
                        + err.getMessage());

有必要进行第二次捕获的原因吗?它似乎只影响 while (itr.hasNext()) 而不会抛出任何异常

或者如评论所述,确保方法在任何情况下都不会抛出异常只是过于谨慎

// do not throw any exception here. 

实际上 java 允许您在没有任何 error/warning:

的情况下复制这样的 try-catch
 try {
     try {
            ScriptEngineFactory fact = itr.next();
            engineSpis.add(fact);
        } catch (ServiceConfigurationError err) {
            err.printStackTrace();
        }
    } catch (ServiceConfigurationError err) {
        err.printStackTrace();
    }

如果我在同一次尝试中连接捕获,我会得到编译错误

Unreachable catch block for ServiceConfigurationError. It is already handled by the catch block for ServiceConfigurationError

小误解:第二个 catch 不仅涵盖 while 循环。它还会处理从第一个 catch 块中抛出的此类异常。

但你是对的:那个 catch 块,以及循环 "header" 不应该抛出这样的异常。以这种方式简单地迭代迭代器需要 "protection" 似乎很奇怪。

因此:也许这是该方法中存在其他代码时的遗留问题。或者它是过度的。或者最坏的情况,我们看不到的代码(创建迭代器)实际上会抛出那种错误。如前所述,至少可以说,这将是一个奇怪且非常奇怪的设计。