2.81M
Category: programmingprogramming

Exceptions. Бросание исключения

1.

О Б РА Б ОТ К А И С К Л Ю Ч Е Н И Й
Дата

2.

С ОД Е РЖ А Н И Е
Что такое исключение?
Виды исключений.
Перехват и обработка исключений.
Преимущества использования механизма
исключений.
5. Резюме.
1.
2.
3.
4.
обработки
2

3.

Ч ТО ТА КО Е И С К Л Ю Ч Е Н И Е ?
Исключение (exception) – событие, возникающее в ходе
выполнения программы, которое разрушает нормальный
поток команд программы.
3

4.

БРОСАНИЕ ИСКЛЮЧЕНИЯ
• В момент возникновения ошибки создаётся объект
исключения, содержащий информацию об ошибке
(включая её тип и место в программе, где она произошла).
• Бросить (throw) исключение - значит создать объект
исключения и передать его в систему исполнения.
4

5.

С Т Е К В Ы З О В О В М Е ТОДО В
Стек вызовов методов (call stack) – цепочка методов,
приводящая к вызову конкретного метода.
5

6.

О Б РА Б ОТ Ч И К И С К Л Ю Ч Е Н И Й
• Обработчик
обработать.
исключения

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

7.

ВИДЫ ИСКЛЮЧЕНИЙ
• Проверяемые
• ожидаемые;
• внутренние;
• нормальная работа может быть восстановлена.
7

8.

ВИДЫ ИСКЛЮЧЕНИЙ
• Проверяемые
• ожидаемые;
• внутренние;
• нормальная работа может быть восстановлена.
• Ошибки
• неожидаемые;
• внешние;
• нормальная работа не может быть восстановлена.
8

9.

ВИДЫ ИСКЛЮЧЕНИЙ
• Проверяемые
• ожидаемые;
• внутренние;
• нормальная работа может быть восстановлена.
• Ошибки
• неожидаемые;
• внешние;
• нормальная работа не может быть восстановлена.
• Непроверяемые
• неожидаемые;
• внутренние;
• нормальная работа не может быть восстановлена.
9

10.

И Е РА РХ И Я К Л АСС О В
10

11.

С ТА Н Д А Р Т Н Ы Е И С К Л Ю Ч Е Н И Я
Исключение
Случай использования
IllegalArgumentException
Невалидное
параметра
IllegalStateException
Неподходящее состояние объекта
для вызова метода
NullPointerException
Значение параметра null, где это
запрещено
IndexOutOfBoundsException
Значение индекса за пределами
допустимого
значение
не
null
ConcurrentModificationException Обнаружено
параллельное
изменение объекта, где это
запрещено
UnsupportedOperationException
Объект не поддерживает метод
11

12.

С О Б С Т В Е Н Н Ы Е К Л АСС Ы И С К Л Ю Ч Е Н И Й
• Действительно ли вам требуется тип исключения, который не
присутствует в Java?
• Поможет ли пользователям тот факт, что они смогут отличать
ваше исключение от исключений, бросаемых классами,
написанными сторонними разработчиками?
• Будет ли ваше исключение бросаться более чем из одного
места?
• Если вы используете чьё-либо другое исключение, будет ли
пользователям оно доступно? Должен ли ваш пакет быть
независимым и самодостаточным?
12

13.

П Е Р Е Х ВАТ И О Б РА Б ОТ К А И С К Л Ю Ч Е Н И Й
13

14.

Б Л О К C ATC H
• На один блок try может быть несколько блоков catch.
• Каждый блок catch является обработчиком только того
типа исключения, который указан в его аргументе.
14

15.

Б Л О К C ATC H
В аргументе блока catch может быть указано несколько
типов, который он обрабатывает. Они разделяются
вертикальной чертой (|).
Пример:
catch (IOException | ItemNotFoundException e)
15

16.

Б Л О К C ATC H
Система исполнения вызывает первый из блоков, аргумент
которого совпадает с типом брошенного исключения.
Пример:
} catch (MalformedURLException e) {

} catch (IOException e) {

} catch (ItemNotFoundException e) {

}
16

17.

Б Л О К F I N A L LY
• Всегда исполняется, когда программа выходит из блока
try, но после исполнения обработчика исключения, если
он есть.
• В основном применяется для кода очистки.
• Если JVM заканчивает работу во время выполнения блока
try или catch, то блок finally может не исполнится.
17

18.

T RY С Р ЕС У Р С А М И
• Try с ресурсами – это выражение try, объявляющее один
или более ресурсов, которые должны быть закрыты после
исполнения блока try и обработчика исключения, если он
есть.
• Закрываемые ресурсы должны реализовывать интерфейс
Autocloseable.
Пример:
try (
ZipFile zipFile = new ZipFile(zipFileName);
BufferedWriter writer = newBufferedWriter(path, charset)
){

} catch (IOException e) {

}
18

19.

КАК БРОСИТЬ ИСКЛЮЧЕНИЕ?
Для того, чтобы бросить исключение используйте ключевое
слово throw.
Пример:
throw new FileNotFoundException();
19

20.

КАК БРОСИТЬ ИСКЛЮЧЕНИЕ?
• Используйте ключевое слово throws в сигнатуре метода,
чтобы задекларировать бросаемые исключения.
Пример:
void someMethod() throws FileNotFoundException {

};
• Всегда документируйте бросаемые методом исключения.
20

21.

Т Р Е Б О ВА Н И Е « C ATC H O R S P EC I F Y »
Если бросаете проверяемое исключение, то:
• либо перехватите его в выражении try
void someMethod() {
try {

throw new SomeException();
} catch (SomeException e) {

}
}
• либо добавьте его тип в секцию throws
void someMethod() throws SomeException {
throw new SomeException();
}
21

22.

Т Р Е Б О ВА Н И Е « C ATC H O R S P EC I F Y »
Метод, который переопределяет метод предка, не может бросать
проверяемые исключения, которые не задекларированы в
переопределяемом методе или расширяют их.
public class SomeException extends Exception {
}
class A {
void foo() throws SomeException {
...
}
}
class A {
void foo() throws Exception {
...
}
}
class B extends A {
void foo() throws Exception {

throw new Exception();
}
}
class B extends A {
void foo() throws SomeException {

throw new SomeException();
}
}
22

23.

ЦЕПОЧКА ИСКЛЮЧЕНИЙ
Часто бывает удобно ответить на появление одного
исключения
бросанием
другого.
Возникает
цепочка
исключений.
Пример:
try {

} catch (IOException e) {
throw new SampleException("Other exception", e);
}
23

24.

ЦЕПОЧКА ИСКЛЮЧЕНИЙ
Используйте следующие методы и конструкторы класса
Throwable для работы с такими цепочками:
Throwable getCause()
Throwable initCause(Throwable)
Throwable(String, Throwable)
Throwable(Throwable)
24

25.

И С П ОЛ Ь З У Й Т Е П РА В И Л Ь Н О
Исключения для исключительных ситуаций!
try {
int i = 0;
while (true) {
range[i++].climb();
}
} catch (ArrayIndexOutOfBoundsException e) {
}
for (Mountain m : range) {
m.climb();
}
25

26.

И С П ОЛ Ь З У Й Т Е П РА В И Л Ь Н О
Не забывайте про атомарность! Оставьте объект в том
состоянии, в каком он был до вызова метода, бросившего
исключение.
26

27.

И С П ОЛ Ь З У Й Т Е П РА В И Л Ь Н О
Способы достижения атомарной отказоустойчивости:
1. неизменяемые объекты;
2. проверка параметров на правильность до исполнения
основной операции;
3. код восстановления в случае ошибки;
4. исполнить операцию на копии объекта и заменить
оригинал объекта на копию в случае успеха.
27

28.

П Р Е И М У Щ ЕС Т ВА
1. Основной код отделяется от кода по обработке ошибок.
2. Передача ошибок выше по стеку вызовов.
3. Группировка и дифференцирование типов ошибок.
28

29.

РЕЗЮМЕ
• Механизм исключений используется для перехвата и обработки
ошибки
выполнения
программы.
Исключения
для
исключительных ситуаций!
• Все классы исключений являются потомками класса Throwable и
описывают тип бросаемого исключения.
• Бывают проверяемые, непроверяемые исключения и ошибки.
• Чтобы бросить исключение используется ключевое слово throw.
• Если метод бросает/пробрасывает проверяемое исключение, то
он должен задекларировать его в секции throws.
• Программа
может
перехватывать
исключения
использования try – catch – finally блоков.
• Блок finally гарантированно будет вызван.
путём
29

30.

СПАСИБО!
30
English     Русский Rules