Преимущества исключений Java, которые помогают создавать более совершенные обработчики ошибок

Обработка ошибок составляет большую часть рабочего дня разработчика. Мы исправляем ошибки, исследуем ошибки и создаем процедуры обработки.

Исправление ошибок требует большой ответственности. В зависимости от контекста последствия могут стоить миллиарды долларов. Джеймс Гослинг делится историей своего друга:

Джеймс Гослинг: Если вы пишете программу для сверки транзакций для какого-то банка, вы можете обнаружить, что тринадцать миллиардов долларов просочились из какой-то системы из-за ошибки. На самом деле у меня был друг, который потерял тринадцать миллиардов долларов за одну ночь из-за ошибки.

В чем преимущества исключений? Какие преимущества дают исключения по сравнению с кодами ошибок? Что вы не знаете об исключениях? В чем разница между ошибкой и исключением в Java?

Давайте ответим на эти вопросы. Давайте начнем.

Разделение обработки ошибок

Коды ошибок по-прежнему действительны в процедурном мире. Действительно для обработки ошибок. Итак, вы можете видеть такие блоки в программах на C:

Вот тут-то и вступают в игру исключения. У вас есть обработка ошибок внизу в предложении catch. Обработка ошибок не смешивается с основным потоком.

Happy flow comes first, cloudy one at the end.

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

Распространение ошибки

С кодами ошибок вызывающий должен обрабатывать коды ошибок вызываемого. Нет распространения ошибок. Клиент получает -1, и код клиента обрабатывает этот код ошибки.

За исключениями, с предложением throws, вы можете обойти это поведение. Вы даже можете переводить исключения, отбрасывать их заново и обрабатывать их где угодно.

Экземпляры исключений

В процедурном мире у вас есть собственные коды ошибок. Структуры могут быть оболочкой пользовательских кодов ошибок. Это не идиоматика для мира ООП. Еще один недостаток - отсутствие стандартизации, что может привести к загадочному коду.

MYAPIError error;
int size;
size = getObjectSize(h, &error);
if(error != MYAPI_SUCCESS) {
    // Error handling
}

Большая ценность исключений - это унификация отчетов об ошибках: стандартный механизм для сообщения об ошибках, а не попурри игнорируемых подходов, которые были у нас в C (и, следовательно, C ++, который только добавляет исключения к миксу, и не делает его эксклюзивным подходом). Большое преимущество Java перед C ++ состоит в том, что исключения - единственный способ сообщать об ошибках. - Брюс Экель о Проверенных исключениях

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

Нечестное преимущество (не) проверенных исключений

Это мой взгляд на проверенные Java и непроверенные исключения. Мы пройдем через распространенные заблуждения и истины.

Когда использовать неотмеченные исключения? Используйте их для выявления ошибок в коде, а не в данных. Проблемы, требующие изменения кода, неустранимого состояния и постоянных сбоев.

Что делает непроверенное исключение для вашего опыта разработчика? Выявляет точку сбоя, которую необходимо устранить. Помогает при отладке, так как вы получаете трассировку стека. Выявляет постоянный сбой с надлежащим ведением журнала.

Когда использовать отмеченные исключения? Используйте их для выявления ошибок в данных, а не в вашем коде. Проблемы, не требующие изменения кода, исправимое состояние и временные сбои.

Атомарный код отказа. Я читал об этом в « Эффективная Java ». Вы оставляете объекты без изменений состояния. Обрабатывайте сбои с помощью отмеченных исключений и двигайтесь дальше.

«Вообще говоря, неудачный вызов метода должен оставить объект в том состоянии, в котором он находился до вызова. Метод с этим свойством называется атомарным при отказе ». - Джошуа Блох

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

В чем еще преимущество проверенных исключений? Ваша обработка ошибок лаконична. Ваша обработка ошибок устойчива. Помещаем проверенные исключения ближе к точке возможного сбоя. Мы можем восстанавливаться после сбоев, что приводит к созданию отказоустойчивого и надежного программного обеспечения.

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

Не стоит отказываться от простой обработки ошибок. Даже простое логическое значение может иметь значение. Возвращать истину или ложь в зависимости от результата достаточно в определенном контексте. Также лучше вернуть Optional вместо пустого улова. Вы можете применить простую обработку ошибок. Пустой Optional или false в качестве возвращаемого типа, если он вам подходит.

Вот один совет о том, что можно использовать для обработки ошибок:

Истина и ложь хорошо сочетаются друг с другом. Пустота и исключение хорошо сочетаются друг с другом. Истина и исключение идут рука об руку, как кошки и налоги. Когда-нибудь я, возможно, буду читать ваш код. Пожалуйста, не делай этого со мной. - Candied_orange, 12 сен 2016

Исключительный перевод

Джеймс Гослинг: это место, где перевод исключений может оказаться полезным. Если у вас есть что-то, что должно считывать базу данных, и где-то глубоко внутри это может предположительно получить MalformedURLException, вероятно, нет смысла распространять это наружу как MalformedURLException. Лучше подумать о том, какие исключения действительно являются частью интерфейса, а не просто артефактом того, как был реализован базовый метод. В механизме исключений Java исключения могут иметь ссылку на другие исключения в качестве их причины. Итак, вы создаете новый IOException и устанавливаете его причину для этого MalformedURLException. И вы собираете их вместе. Это было очень эффективно.

Преобразование исключений отлично подходит для выявления причины сбоя. Вам нужно распространить исключение? Оберните конкретное общее исключение и распространите общее исключение.

Что делает для вас перевод исключений? Просто это означает исключение. Уровень обслуживания и уровень представления различаются. При распространении ошибок между слоями вам необходимо сохранить информацию. Перевод полезен, чтобы обернуть исключение в конкретное для слоя.

Забрать

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

Использование отмеченных исключений упрощает восстановление. Использование непроверенных позволяет точно определить точку отказа.

Может помочь простая обработка ошибок, но исключения лучше справляются с обработкой ошибок. Они стандартные, узнаваемые и понятные.

использованная литература

Интервью с Джеймсом Гослингом