Преимущества исключений 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
. И вы собираете их вместе. Это было очень эффективно.
Преобразование исключений отлично подходит для выявления причины сбоя. Вам нужно распространить исключение? Оберните конкретное общее исключение и распространите общее исключение.
Что делает для вас перевод исключений? Просто это означает исключение. Уровень обслуживания и уровень представления различаются. При распространении ошибок между слоями вам необходимо сохранить информацию. Перевод полезен, чтобы обернуть исключение в конкретное для слоя.
Забрать
Исключения отлично подходят для именования ошибок. Вы можете манипулировать ими, переводить и создавать обработчики.
Использование отмеченных исключений упрощает восстановление. Использование непроверенных позволяет точно определить точку отказа.
Может помочь простая обработка ошибок, но исключения лучше справляются с обработкой ошибок. Они стандартные, узнаваемые и понятные.