Подтвердить что ты не робот

Что означает "утка исключение"?

В разделе Преимущества исключений в учебниках Java ™:

Метод может утащить любые исключения, брошенные внутри него, тем самым позволяя методу дальше стека вызовов, чтобы поймать его.

[...]

... ducking exception требует некоторых усилий со стороны методов посредника. Любые проверенные исключения, которые могут быть выбраны внутри метода, должны быть указаны в его предложении throws.

Что означает "утка исключение"? Я искал в Интернете и FOLDOC (бесплатный он-лайн словарь вычислений), но не нашел ничего, что выглядело бы многообещающим.

4b9b3361

Ответ 1

"Утка исключение" означает "не обрабатывать исключение". Это фактически объясняет название: to duck означает "Уклоняться от уклонения".

Метод, уклоняющийся от исключения, просто не обрабатывает его (потому что, например, он не является его целью), и пусть исключение будет передано вызывающему методу.

Например, рассмотрим метод, целью которого является подсчет количества строк в файле. Это будет простая реализация (Java 8):

private static long numberOfLines(Path path) throws IOException {
    try (BufferedReader br = Files.newBufferedReader(path)) {
        return br.lines().count();
    }
}

Обратите внимание, что этот метод не обрабатывает IOException, который вызывается Files.newBufferedReader(path), потому что это не цель метода. Он утихает и позволяет вызывающему персоналу обращаться с ним соответствующим образом.

Обратите внимание, что вызывающий может также утаить исключение и позволить его вызывающему агенту обрабатывать его и т.д.

Ответ 2

Ну, уклонение просто означает опустить голову, чтобы не попасться или не увидеть. В этом случае "утка исключение" просто означает, что ваш код не попадает в исключение.

Для того, чтобы ваш метод не попадал в исключение, вы бросаете его дальше в стек вызовов, объявляя исключение throws в своем методе

public void myMethod() throws IOException {

}

Если вы не утка, вы должны catch его:

public void myMethod() {
    try {
       // ...  

    } catch(IOException e) {
      // handle exception
    }

Ответ 3

Я думаю, что это означает, что метод может поймать исключение и повторно бросить его для другого метода, чтобы поймать его и обработать его по мере необходимости. Или просто бросьте новое исключение. Или избегайте ловить исключение и позволяйте ему пузыриться в стеке вызовов. Дело в том, что метод делегировать обработку делегатов должен иметь другой метод, который может быть более подходящим для обработки данного исключения (например, путем доступа к необходимым данным и/или состоянию). Но (для java) это требует объявления методов с предложением throws все время, которое легко становится шаблоном

как упоминается в комментарии @jmcg, буквально "DUCK просто означает опустить голову, чтобы избежать попадания или увидеть" (например, утки в реке).

Ответ 4

Я думаю, что утка означает повторное выброс исключения... другими словами, игнорируйте его, надеясь, что кто-то другой справится с этим:)