[Из песочницы] Исправляем 7 распространенных ошибок обработки исключений в Java

Комментарии 3

  • 09.09.17 в 17:44

    0

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


    Суть в том, что если вы не словили что-то в main потоке, то в худшем случае упадет все приложение. И вы об этом узнаете (хотя возможно в логах и будет пусто). А если упадет какой-то поток — то вы вообще не узнаете ничего. Типовой случай — callback в потоке, созданном фреймворком.

  • 09.09.17 в 17:54

    0

    Седьмой совет вредный.
    Исключения обязаны перехватываться на границах уровней абстракции.
    Исключение с ошибкой открытия файла станет исключением невозможности загрузки конфигурации, а оно в свою очередь превратиться в исключение при инициализации сервиса и т.д.
    В противном случае исключение выходит за границы контекста, в котором оно имеет смысл и теряет шансы быть реально обработанным вместо проброса и проглатывания.


    Четвертый совет дает неверные аргументы и игнорирует один важный случай.
    Исключения — это структурный переход вперед-вверх, что является полезной разновидностью goto, такой же как return или continue.
    Но они непригодны для обычного потока управления, так как очень дороги в плане потребления ресурсов.
    В языках, где это не так (питон) исключения используются куда шире.
    Есть один случай когда исключение можно использовать в обычном потоке управления и в яве: это прерывание выполнения задачи. Здесь раскрутка стека в плюс, а потребление ресурсов не в минус.

    • 25d8225541b6a5c30137a4ee46f075e6_small.j

      09.09.17 в 23:15

      0

      Но они непригодны для обычного потока управления, так как очень дороги в плане потребления ресурсов.

      Не стоит привязывать к потреблению ресурсов. Даже если бы они были дешёвыми, на них не стоит строить нормальный поток выполнения программы.


      Java движется в сторону удешевления исключений, например, в Java 7 добавили конструктор Throwable (String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace), который даёт возможность опустить запись стектрейса. А для тех, кому он нужен и для этого создают исключение, в Java 9 добавили StackWalker API

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

© Habrahabr.ru