Обработка ошибок и исключения — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Так когда же нужно бросать ошибки?)
Строка 16: Строка 16:
 
Нарушение контракта со стороны создателя метода - это, например, что-нибудь на подобии <tex>MethodNotImplementedYetException</tex>.
 
Нарушение контракта со стороны создателя метода - это, например, что-нибудь на подобии <tex>MethodNotImplementedYetException</tex>.
 
Пользователь метода может нарушить контракт, например, таким способом: на вход <tex>Integer.parseInt(String)</tex> подать строку с буквами и по заслугам получить <tex>NumberFormatException</tex>
 
Пользователь метода может нарушить контракт, например, таким способом: на вход <tex>Integer.parseInt(String)</tex> подать строку с буквами и по заслугам получить <tex>NumberFormatException</tex>
 +
 +
== А что собственно бросать? ==
 +
Выбор не то чтобы сильно велик, но и не однозначен: <tex>checked,</tex>  <tex>unchecked</tex> <tex>(runtime)</tex>, <tex>unchecked</tex> <tex>(error).</tex>
 +
В подавляющем большинстве случаев <tex>Error</tex> вам не понадобится. Это в основном критические ошибки (например, <tex>StackOverflowError</tex>), с которыми пусть работает JVM.
 +
<tex>Checked</tex> <tex>Exceptions</tex>, как было написано выше, заставляет программиста-пользователя написать код для ее обработки или же описать метод как “вызывающий исключительную ситуацию”.
 +
С <tex>unchecked</tex> <tex> exception</tex> можно поступить по-разному. В случае с такими ошибками, пользователь сам решает, будет он обрабатывать эту ошибку, или же нет (компилятор не заставляет это делать).
 +
Можно написать следующее простое правило: если некоторый набор входящих в метод данных может привести к нарушению контракта, и вы считаете, что программисту-пользователю важно разобраться с этим (и что он сможет это сделать), описывайте метод с конструкцией <tex>throws</tex>, иначе бросайте <tex>unchecked</tex> <tex>exception.</tex>

Версия 20:51, 17 июня 2013

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

Введение

В языке [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]