2. Устаревший подход: С
• Функция возвращает результат завершения операции (успех
или код ошибки)
• Изменённые данные передаются как in-out параметр
int do_stuff(data* d) { … }
…
err_code = do_stuff(&sample);
if (err_code == E_SUCCESS) { … }
Недостатки:
• Подход приводит к избытку дополнительных проверок,
ухудшает читаемость кода
3. Исключения: С++
Преимущества:
• Как и полагается, метод возвращает обработанные данные
• В случае возникновения чрезвычайной ситуации система
генерирует специальный объект-исключение, которое содержит
информацию об ошибке
• Подход добавляет гибкости при обработке исключений,
оставляя код наглядным и прозрачным
Недостатки:
• Исключением может оказаться переменная любого типа
4. Исключения: Java
• Все исключения – объекты потомков класса Throwable
• Исключения содержат полезную информацию об
исключительных ситуациях
• Полезные методы для обработки исключений (например, можно
получить содержимое стека)
5. Типы исключений
• Exception – исключения, которые стоит обрабатывать внутри
программы
• Error – серьёзные проблемы с работой программы, которые
нельзя обработать (например, умершие треды)
• RuntimeException – исключения, связанные с работой среды
выполнения
Error и RuntimeException – так называемые Unchecked
Exceptions
6. Почти всегда стоит использовать
Checked Exceptions
по крайней мере, это соответствует оригинальной
идеологии Java
7. Throwing Exceptions
• Бросить исключение можно с помощью слова throw
• Если метод бросает исключение и не ловит его, в сигнатуре
должно содержаться описание исключения:
void pwnBase(String baseName) throws
AlreadyPwnedException, BaseNotFoundException {
…
}
8. Замечания
• Классы-потомки не могут добавлять новые исключения к
методу, описанному в классе-родителе
• В классе-потомке при перекрытии метода допускается опускать
секцию throws
9. Catching Exceptions
• Блок обработки исключения начинается ключевым словом
catch
• Несколько блоков catch могут располагаться последовательно
• Обработка исключений полностью соответствует идеям
полиморфизма
try { alien.pwnBase( “Earth-0xFFFE”); }
catch (AlreadyPwnedException ape) { … }
catch (Exception e) { … }
10. Блок finally
• Блок finally выполняется почти всегда после завершения
работы блока try (и, возможно, после catch, если таковые
есть)
• Блок finally не выполняется, если при работе try/catch
умер тред, в котором вывалилось исключение
11. Best Practices for API Design
• Бросая исключение, подумайте: что сможет сделать
пользователь в исключительной ситуации?
• Сохраняйте наследование
• Не создавайте новые классы-исключения, если в классе не
будет храниться полезная информация об исключении
• Уровень абстракции метода должен совпадать с уровнем
абстракции исключения
• Документируйте исключения и исключительные ситуации
(@throws, …)
12. BestPractices for Using Exceptions
• Всегда закрывайте открытые ресурсы (в блоке finally)
• Никогда не используйте исключения для контроля за потоком
выполнения
• Не игнорируйте исключения
• Не ловите исключения класса Exception
14. Исключения и потоки
• С каждым тредом связан стек
• Пропущенное исключение поднимается вверх по стеку
• Если исключение поднимается до верхушки стека, то поток
вызывает метод uncaughtException у группы умирающего
потока
• По умолчанию вызывается uncaughtException у
родительской группы
• Если родитель отсутствует, то вызывается метод
Throwable.printStackTrace(), и тред благополучно
погибает.
15. Почти всегда стоит использовать
Checked Exceptions?!
Оказалось, что не всё так просто: даже идеологи
Java (Брюс Эккель в их числе) рекомендуют
использовать Unchecked Exceptions
16. Unchecked Exceptions
Варианты использования:
• Не существует адекватного способа выхода из исключительной
ситуации
• Единственный возможный способ выйти из исключительной
ситуации – прервать выполнение программы
Unchecked Exceptions используются в Python, C# и других языках.
17. Отладка приложений
Способы отладки:
• Старые добрые System.out.println();
• API для отладки (Runtime, …)
• Специальные debug-сборки (с сохранением информации о
номерах строк)
• Использование средств отладки в IDE
• Начиная с версии 1.6.0_10, в JDK входит VisualVM, инструмент
для отладки, диагностики и профилирования java-приложений