Обработка исключений.
Функции обработки исключений помогают справиться с непредвиденными или исключительными проблемами, которые возникают при выполнении программы.
Обработка исключений использует ключевые слова try
, catch
и finally
для действий, которые могут оказаться неудачными.
Для того, что бы вызвать исключение используется ключевое слово throw
Для выполнения конструкций, которые могут создавать исключение следует испрользовать блок try
.
Когда внутри блока try
возникает исключение, поток управления переходит к первому подходящему обработчику исключений в стеке вызовов.
Ключевое слово catch
как раз и есть обработчик исключений.
Все объекты исключения содержат подробные сведения об ошибке, как например состояние стека вызовов и текстовое описание ошибки.
Код в блоке finally выполняется даже в том случае, если создано исключение. Блок finally следует использовать, чтобы высвободить ресурсы, например закрыть потоки и файлы, которые были открыты внутри блока try.
Кусок метода, запрашивающего данные с сервера. Если запрос провалился - генерируется исключение и метод возвращает null
.
private String getData()
{
String request = "https://assets.gelbooru.com/images/21/07/2107a4a1b2e1585facb7aeca892a1a65.jpg";
String xml;
try {
xml = HttpRequest.get(request).body(); //попытка получить post-request
} catch (HttpRequest.HttpRequestException e) { // Исключение вызывается в том случае, если что-то пошло не так(обрыв связи).
e.printStackTrace();.//вывод подробных сведений об ошибке
return null;
}
return xml;
}
//...
Блок try
без блока catch
или finaly
вызовет ошибку компилятора.
Блок сatch
может определять тип перехватываемого исключения.
Несколько блоков catch
с различными фильтрами исключений могут быть соединены друг с другом.
Блоки catch
проверяются сверху вниз в коде, однако для каждого вызванного исключения выполняется только один блок catch
.
Выполняется первый блок catch
, в котором указан точный тип или базовый класс вызванного исключения.
Если нет блока catch
, в котором определен соответствующий фильтр исключений, выбирается блок, в котором не выбран фильтр, если таковой имеется в операторе.
Важно, чтобы первыми были размещены блоки catch
с самыми производными типами исключений.
private char getData(char[] array, int index)
{
try
{
return array[index]; //попытка получить элемент массива
}
catch(System.ArgumentOutOfRangeException e)
{
//Это исключение является производным от IndexOutOfRangeException,
//поэтому если поставить его после IndexOutOfRangeException, это будет бессмысленно.
LogError(e);//вывод подробных сведений об ошибке
}
catch (System.IndexOutOfRangeException e) {
LogError(e);//вывод подробных сведений об ошибке
}
// /~
}
//...