Don't Group Exception Catchers

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

Иногда мы повторно выбрасываем исключения. В Java мы делаем это чаще, чем в других языках, потому что у нее есть проверяемые исключения. Иногда нам приходится перехватывать и повторно выбрасывать несколько исключений, возникших из разных мест в методе. В Java 7 была введена группировка разных типов исключений в одном блоке catch. Но даже без группировки можно просто перехватить IOException или даже Exception и предоставить один блок catch для всех типов и всех источников (методов, выбрасывающих исключения). Недавно я осознал, что это плохая практика. Вот почему.

Рассмотрим этот метод на Java (я использую Apache Commons IO):

Это не идеально. Давайте перепишем его, чтобы предоставить больше контекста ошибки, как было предложено ранее:

Здесь исключение может быть сгенерировано в трех местах:

  • По методу openStream()

  • Методом toByteArray (https://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/IOUtils.html#toByteArray-java.io.InputStream-)

Независимо от того, кто бросает, мы ловим это в одном и том же блоке catch и повторно бросаем с тем же сообщением. Я считаю, что это плохо, потому что контекст ошибки, предоставленный повторным броском, менее сфокусирован на возникшей проблеме.

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

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

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

Очевидно, я считаю, что группировка типов исключений в одном блоке catch является плохой практикой.

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-17 at 14:56

sixnines availability badge   GitHub stars