Что означает "утка исключение"?
В разделе Преимущества исключений в учебниках Java ™:
Метод может утащить любые исключения, брошенные внутри него, тем самым позволяя методу дальше стека вызовов, чтобы поймать его.
[...]
... ducking exception требует некоторых усилий со стороны методов посредника. Любые проверенные исключения, которые могут быть выбраны внутри метода, должны быть указаны в его предложении throws
.
Что означает "утка исключение"? Я искал в Интернете и FOLDOC (бесплатный он-лайн словарь вычислений), но не нашел ничего, что выглядело бы многообещающим.
Ответы
Ответ 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
Я думаю, что утка означает повторное выброс исключения... другими словами, игнорируйте его, надеясь, что кто-то другой справится с этим:)