The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
Часто бывает, особенно в Java, что в нескольких местах метода возможно возникновение исключений. Обычно мы создаем большой блок try
с одним catch
внизу. Мы ловим все исключения, обычно даже используя группировку. Это помогает нам минимизировать шум, который создает ловля исключений. Однако, такие большие блоки try
подвергают сомнению поддерживаемость: мы не можем предоставить правильный контекст ошибки внутри блоков catch
.
Что, по вашему мнению, не так с этим методом на Java (кроме использования System.out
вместо внедренной зависимости)?
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.regex.Pattern;
void grep(Path file, Pattern regex) { try { for (String line : Files.readAllLines(file)) { if (regex.matcher(line).matches()) { System.out.println(line); } } } catch (IOException ex) { throw new IllegalStateException(ex); } } ```
Я считаю, что его блок try/catch слишком большой. `IOException` может быть вызван только статическим методом [`readAllLines`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#readAllLines-java.nio.file.Path-) , но блок охватывает несколько других вызовов методов и операторов. Этот код был бы лучше:
void grep(Path file, Pattern regex) { String[] lines; try { lines = Files.readAllLines(file); } catch (IOException ex) { throw new IllegalStateException(ex); } for (String line : lines) { if (regex.matcher(line).matches()) { System.out.println(line); } } }
Теперь блок try/catch охватывает исключительно место, где может возникнуть исключение. Ничего больше!
Почему меньшие блоки try лучше? Потому что они позволяют более целенаправленную отчетность об ошибках с более подробным контекстом. Например, второй фрагмент может быть переписан следующим образом:
void grep(Path file, Pattern regex) { String[] lines; try { lines = Files.readAllLines(file); } catch (IOException ex) { throw new IllegalStateException( String.format( “Failed to read all lines from %s”, file ), ex ); } for (String line : lines) { if (regex.matcher(line).matches()) { System.out.println(line); } } } ```
Можем ли мы сделать то же самое со вторым фрагментом кода? Можем, но сообщение об ошибке будет некорректным, потому что блок охватывает слишком много.
Translated by ChatGPT gpt-3.5-turbo/35 on 2023-09-06 at 20:26