Вы находитесь на странице: 1из 6

Занятие 8. Исключительные ситуации.

Exception, Error

В момент написание данной книги, я активно изучал Scala. И мне очень


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

Вначале следует разобраться, что же такое исключённые ситуации и почему


они могут возникнуть в программе.

Обратимся к Wiki

Обрабо́тка исключи́тельных ситуа́ций (англ. exception handling) —


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

Особое внимание хочу уделить слову – бессмысленности дальнейшей


отработки программы.

В этих словах заключен смысл всего механизма. Но в большинстве случаев


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

В Java механизм исключительных ситуаций реализуется с помощью


интерфейса Throwble. И разделяется на три основные группы- Error. Unhandle
exception, Handle Exception.
Рассмотрим каждую из них.

Error – проблемы связанные с виртуальной машиной. Например, Загрузка в


память дубликат класса (библиотеки). В такой ситуации виртуальная машина
прекращает свою работу.

Unhandle exception – Ситуации связанные с внешними факторами. Например,


оборвалось соединение с базой данных, Нарушение арифметический
операций (деление на ноль).

Handle exception – Ситуации нарушение логики программы. Например,


Отсутствие данных, не корректные данные. Пользователь пытается получить
доступ к информации, которой уже нет.

Error. Unhandle – исключительные ситуация, которые не обрабатываются.


Потому что в этом нет смысла.

Handle – обрабатываются с помощью двух конструкций.

В данном примере обработка ввода данных будет выполняться до тех пор,


пока пользователь не введет корректные данные. Если он ввел не корректные
данные, выполняется блок catch и цикл выполняется заново.

Другой способ работы с исключительными ситуациями – это передача


обработки исключения на код клиента. Давайте рассмотрим пример.

Создадим новый тип исключительной ситуации. UserException.

И используем его в новом методе вычисляющим проценты.


В данном случаи, мы передаем всю обработку ошибкой на код клиента (тот,
кто использует данный класс). Теперь клиенту нужно будет добавлять
обработку этой ситуации или передавать ее выше стоящему коду.

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

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

Используется ключевое слово throw, а дальше указывается объект


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

То есть в большинстве случаев все ситуации связаны с невозможностью


получить какие-либо данные и нужно возвращать либо null, либо
использовать исключительную ситуацию.

Я предлагаю воспользоваться другим походом, который я позаимствовал в


Scala. Забавный получился момент с этой конструкцией. Книгу я начал
писать в 2015 году, а завершаю ее в 2016. На тот момент я не особо уделял
внимание новый введениям в Java а был полностью поглощён изучением
Scala. Как оказалась идея с Option понравилась не только мне, но и
создателям Java. В Java 8 добавили новый класс java.lang.Optional, который в
точности реализует идею, которую создана в Scala и которая описана ниже. Я
не стал удалять этот текст и код, т.к. она раскрывает проблему передачу null
ссылочный объектов и показывает одно из возможных решений.

Это решение использовать универсальную обертку класс.


Давайте посмотрим, как можно переписать метод percent c использованием
этого класса.

и сравним код тестов.


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

Так же нужно отметить, что теперь при написании тестов нужно проверять
поведение, которое выбрасывает исключительные ситуации тоже.

Давайте рассмотрим пример с методов вычисляющим проценты.

Первый случай проверяет корректное выполнение метод. Давайте теперь


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

Главное изменения – в аннотацию @Test добавлено свойство expected.


Теперь если метод не выкинет исключение тест не выполниться успешно.
Задания

 Заменить сообщения о нарушении логики в приложении на


перебрасывания исключительных ситуаций.
 Добавить тесты, которые проверяют эти исключения.