Обработка ошибок и исключения

Материал из Викиконспекты
Перейти к: навигация, поиск
Определение:
Исключениями или исключительными ситуациями (состояниями) называются ошибки, возникшие в программе во время её работы.

Введение

В языке [math]Java[/math] исключения [math](Exceptions)[/math] и ошибки [math](Errors)[/math] являются объектами. Когда метод вызывает (бросает - throws) исключительную ситуацию, он на самом деле работает с объектом. Но такое происходит не с любыми объектами, а только с теми, которые наследуются от [math]Throwable.[/math]

Exceptions-throwable.gif

[math]RuntimeException[/math], [math]Error[/math] и их наследников еще называют [math]unchecked[/math] [math]exception[/math], а всех остальных наследников класса [math]Exception -[/math] [math]checked[/math] [math] exception.[/math] [math] Checked[/math] [math] Exception[/math] обязывает пользователя обработать ее (использую конструкцию [math] try-catch [/math].) или же отдать на откуп обрамляющим методам, в таком случае к декларации метода, который бросает проверяемое [math](checked)[/math] исключение, дописывают конструкцию [math]throws[/math], например

public Date parse(String source) throws ParseException { ... }

Так когда же нужно бросать ошибки?

На этот вопрос можно ответить просто: если в методе возможна ситуация, которую метод не в состоянии обработать самостоятельно, он должен “бросать” ошибку. Но ни в коем случае нельзя использовать исключительные ситуации для управления ходом выполнения программы. Чаще всего [math]Exceptions[/math] бросаются при нарушении контракта метода. Нарушение контракта со стороны создателя метода - это, например, что-нибудь на подобии [math]MethodNotImplementedYetException[/math]. Пользователь метода может нарушить контракт, например, таким способом: на вход [math]Integer.parseInt(String)[/math] подать строку с буквами и по заслугам получить [math]NumberFormatException[/math]

А что собственно бросать?

Выбор не то чтобы сильно велик, но и не однозначен: [math]checked,[/math] [math]unchecked[/math] [math](runtime)[/math], [math]unchecked[/math] [math](error).[/math] В подавляющем большинстве случаев [math]Error[/math] вам не понадобится. Это в основном критические ошибки (например, [math]StackOverflowError[/math]), с которыми пусть работает JVM. [math]Checked[/math] [math]Exceptions[/math], как было написано выше, заставляет программиста-пользователя написать код для ее обработки или же описать метод как “вызывающий исключительную ситуацию”. С [math]unchecked[/math] [math] exception[/math] можно поступить по-разному. В случае с такими ошибками, пользователь сам решает, будет он обрабатывать эту ошибку, или же нет (компилятор не заставляет это делать). Можно написать следующее простое правило: если некоторый набор входящих в метод данных может привести к нарушению контракта, и вы считаете, что программисту-пользователю важно разобраться с этим (и что он сможет это сделать), описывайте метод с конструкцией [math]throws[/math], иначе бросайте [math]unchecked[/math] [math]exception.[/math]

Как обрабатывать?

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