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

Msu.Center.Lectures.J05 Handling Exceptions

  • 1.
  • 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 UsingExceptions Всегда закрывайте открытые ресурсы (в блоке finally ) Никогда не используйте исключения для контроля за потоком выполнения Не игнорируйте исключения Не ловите исключения класса Exception
  • 13.
    Исключения и потокиЧто происходит, когда исключение никто не ловит?
  • 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- приложений