Smaller Try-Blocks Are Better

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

sixnines availability badge   GitHub stars