ScriptEngineManager очень осторожная обработка исключений - PullRequest
1 голос
/ 26 мая 2019

Я хотел бы проконсультироваться об обработке исключений кода JDK,

В ScriptEngineManager из строк 120 есть неиспользуемый вторичный улов для 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

1 Ответ

1 голос
/ 26 мая 2019

Незначительное заблуждение: второй улов не только охватывает цикл while. Он также позаботится о таких исключениях, генерируемых в первом блоке catch.

Но вы правы: этот блок catch, а также цикл "header" не должны выдавать такое исключение. Кажется довольно странным, что простая итерация итератора требует «защиты» таким образом.

Таким образом: возможно, это пережиток, когда в этом методе существовал другой код. Или это перебор. В худшем случае код, который мы не видим (который создает этот итератор), на самом деле может выдать такую ​​ошибку. Что, как сказано, было бы странным и очень странным дизайном, если не сказать больше.

...