【问题标题】:ScriptEngineManager extra cautious exception handlingScriptEngineManager 格外谨慎的异常处理
【发布时间】:2019-05-26 12:49:26
【问题描述】:

想咨询一下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允许你复制这样的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

【问题讨论】:

    标签: java exception try-catch scriptengine


    【解决方案1】:

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

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

    因此:当该方法中存在其他代码时,这可能是剩余的。或者是过度了。或者最坏的情况,我们看不到的代码(创建该迭代器)实际上可能会引发这种错误。如前所述,至少可以说,这将是一个奇怪且非常奇怪的设计。

    【讨论】:

    • 为什么没有关于未使用捕获的警告?如果我在同一次尝试中连接,我会得到编译错误Unreachable catch block for ServiceConfigurationError. It is already handled by the catch block for ServiceConfigurationError
    • @user7294900 注意:这不是例外,而是错误的子类。这些没有在方法签名中声明!所以理论上这样的错误可能来自任何地方。当然,通常建议您也不要捕获错误。
    猜你喜欢
    • 2017-01-26
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多