05 Обработка Исключений

672 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
672
On SlideShare
0
From Embeds
0
Number of Embeds
21
Actions
Shares
0
Downloads
12
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

05 Обработка Исключений

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

×