Your SlideShare is downloading. ×
  • Like
Exceptions
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply
Published

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
357
On SlideShare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
2
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide
  • No-leak – отсутствуют утечки памяти, автоматически выполняется в Java Weak – в случае выбрасывания исключения класс остается в согласованном состоянии Strong – в случае выбрасывания исключения, класс остается в том состоянии, в котором был

Transcript

  • 1. Обработка ошибок и исключения Java Advanced http://kgeorgiy.info/courses/java-advanced/
  • 2. Содержание
    • Методы обработки ошибок
    • Исключения
    • Применение исключений в коде
    • Разработка исключений
    • Гарантии безопасности при исключениях
    Java Advanced / Обработка ошибок и исключения
  • 3. Методы обработки ошибок Часть 1
  • 4. Пример: Комплексные числа (1)
    • class Complex {
    • private final double re;
    • private final double im;
    • public Complex(double re, double im) {
    • this.re = re;
    • this.im = im;
    • }
    • ...
    Java Advanced / Обработка ошибок и исключения
  • 5. Пример: Комплексные числа (2)
    • class Complex ...
    • Complex divide(Complex c) {
    • double d = c.re * c.re + c.im * c.im;
    • return new Complex(
    • (re * c.re + im * c.im) / d,
    • (im * c.re - re * c.im) / d
    • );
    • }
    Java Advanced / Обработка ошибок и исключения
  • 6. Методы обработки ошибок
    • Не обрабатывать
    • Коды возврата
    • Установка флага ошибки
    • Вызов метода обработки ошибки
    • Завершение программы
    Java Advanced / Обработка ошибок и исключения
  • 7. Код возврата
    • Изнутри
      • if (Math.abs(d) < EPS) {
      • return null;
      • }
    • Снаружи
      • Complex c = a.divide(b);
      • if (c ! = null) {
      • } else { // Что делать ? }
    Java Advanced / Обработка ошибок и исключения
  • 8. Установка флага ошибки
    • Изнутри
      • if (Math.abs(d) < EPS) {
      • Complex.error = true;
      • return this;
      • }
    • Снаружи
      • Complex c = a.divide(b);
      • if (!Complex.error) {
      • } else { // Что делать ? }
    Java Advanced / Обработка ошибок и исключения
  • 9. Вызов метода обработки ошибок
    • Изнутри
      • if (Math.abs(d) < EPS) {
      • return Complex.divisionByZeroError();
      • }
    • Снаружи
      • Complex c = a.divide(b);
      • // Можно ли доверять c?
    Java Advanced / Обработка ошибок и исключения
  • 10. Завершение программы
    • Изнутри
      • if (Math.abs(d) < EPS) {
      • System.exit(0);
      • return this;
      • }
    • Снаружи
      • Complex c = a.divide(b);
      • // Без права на ошибку
    Java Advanced / Обработка ошибок и исключения
  • 11. Исключения Часть 2
  • 12. Применение исключений (1)
    • Определение исключения
      • class DBZComplexException extends Exception {
      • private final Complex divident;
      • public DBZComplexException(Complex divident) {
      • this.divident = divident;
      • }
      • public Complex getDivident() {
      • return devident;
      • }
      • }
    Java Advanced / Обработка ошибок и исключения
  • 13. Применение исключений (2)
    • Изнутри
      • Complex divide(Complex c)
      • throws DBZComplexException {
      • ...
      • if (Math.abs(d) < EPS) {
      • throw new DBZComplexException(d);
      • }
      • ...
    Java Advanced / Обработка ошибок и исключения
  • 14. Применение исключений (3)
    • Снаружи
      • try {
      • Complex c = a.divide(b);
      • // Безопасное использование результата.
      • } catch ( DBZ ComplexException e) {
      • // Обработка ошибки
      • }
    • Или
      • Complex calculate(...) throws DBZ ComplexException
      • Complex c = a.divide(b);
      • // Безопасное использование результата.
    Java Advanced / Обработка ошибок и исключения
  • 15. Причины ошибок
    • Ошибки программирования
      • NullPointerException
    • Неверное использование API
      • InvalidArgumentException
    • Доступ к внешним ресурсам
      • IOException
    • Системные сбои
      • VirtualMachineError
    Java Advanced / Обработка ошибок и исключения
  • 16. Пример исключения
    • AssertionError
      • Неожиданное состояние программы
    • Варианты использования
      • throw new AssertionError( message ) – недостижимое состояние
      • assert statement [ : message] ; – проверка утверждения
    Java Advanced / Обработка ошибок и исключения
  • 17. Иерархия исключений в Java Java Advanced / Обработка ошибок и исключения
  • 18. Проверяемые исключения
    • Поймать
      • try { } … catch (*Exception e) {}
    • Объявить, что метод может бросить ислючение
      • void method() throws *Exception {
    Java Advanced / Обработка ошибок и исключения
  • 19. Собственная иерархия
    • Exception
      • ComplexException
        • DBZComplexException
        • LogZeroComplexException
    • Пример
      • try {
      • throw new LogZeroComplexException();
      • } catch (ComplexException e) {
      • // Обработка
      • }
    Java Advanced / Обработка ошибок и исключения
  • 20. Информация об исключениях
    • Класс Throwable
      • getMessage() – сообщение об ошибке
      • getCause() – причина исключения
      • printStackTrace() – печать стека исполнения
    Java Advanced / Обработка ошибок и исключения
  • 21. Реализация исключения
    • ComplexException extends Exception {
    • public ComplexException(String message) {
    • super(message);
    • }
    • }
    Java Advanced / Обработка ошибок и исключения
  • 22. Конструкция try-catch-finally
    • try {
    • // Действия, способные вызвать исключение
    • } catch (*Exception e) {
    • // Обработка исключений первого типа
    • } catch (*Exception e) {
    • // Обработка исключений второго типа
    • } finally {
    • // Действия, выполняемые при выходе из блока
    • }
    Java Advanced / Обработка ошибок и исключения
  • 23. Применение исключений в коде Часть 3
  • 24. Выделение кода обработки ошибок
    • Ошибки обрабатываются там, где для этого достаточно информации
      • try {
      • f();
      • } catch (*Exception e) {
      • }
      • f() { g() }
      • g{ … throw new *Exception(…) }
    Java Advanced / Обработка ошибок и исключения
  • 25. Управление ресурсами
    • // Получение ресурса
    • try {
    • // Действия с ресурсом
    • } finally {
    • // Освобождение ресурса
    • }
    Java Advanced / Обработка ошибок и исключения
  • 26. Управление на исключениях
    • try {
    • int index = 0;
    • while (true) {
    • System.out.println(a[index++]);
    • }
    • } catch (IndexOutOfBoundsException e) {
    • }
    Java Advanced / Обработка ошибок и исключения
  • 27. Игнорирование исключений
    • Полное игнорирование
      • try {
      • } catch (Exception e) { }
    • Запись в лог
      • try {
      • } catch (Exception e) {
      • e.printStackTrace();
      • }
    Java Advanced / Обработка ошибок и исключения
  • 28. Ловушки базовых исключений
    • try {
    • } catch (Exception e) {
    • // Что-то полезное
    • }
    Java Advanced / Обработка ошибок и исключения
  • 29. Разработка исключений Часть 4
  • 30. Проверяемые и непроверяемые
    • Что пользователь может сделать с исключением ?
      • Ничего – непроверяемое исключение
      • Что-то осмысленное – проверяемое исключение
    Java Advanced / Обработка ошибок и исключения
  • 31. Сохранение инкапсуляции
    • Пользовательский код не должен знать об устройстве класса
      • Обертывание исключений
        • В непроверяемые
        • В проверяемые
      • Игнорирование исключений
    Java Advanced / Обработка ошибок и исключения
  • 32. Обертывание исключений
    • Правильно
      • try {
      • } catch (IOException e) {
      • throw new APISpecificException (e) ;
      • }
    • Неправильно
      • try {
      • } catch (IOException e) {
      • e.printStackTrace()
      • throw new APISpecificException();
      • }
    Java Advanced / Обработка ошибок и исключения
  • 33. Игнорирование исключений
    • Игнорирование исключений
      • try {
      • } catch (IOException e) {
      • e.printStackTrace();
      • }
    Java Advanced / Обработка ошибок и исключения
  • 34. Гарантии безопасности Часть 5
  • 35. Пример с исключениями
    • а( ) вызывает b() и ловит исключение
      • b() вызывает c() ..
        • d()
            • x() бросает исключение
    Java Advanced / Обработка ошибок и исключения
  • 36. Типы гарантии безопасности
    • Отсутствие гарантий
      • No exceptional safety
    • Отсутствие утечек
      • No-leak guarantee
    • Слабые гарантии
      • Weak exceptional safety
    • Сильные гарантии
      • Strong exceptional safety
    • Гарантия отсутствия исключений
      • No throw guarantee
    Java Advanced / Обработка ошибок и исключения
  • 37. Пример: Обеспечение гарантий
    • Класс
      • class CloneablePair {
      • Cloneable first;
      • Cloneable second;
      • }
    • Метод
      • /* * Копирует содержимое передаваемой пары. Элементы пары клонируются. * /
      • void copyOf(CloneablePair p)
    Java Advanced / Обработка ошибок и исключения
  • 38. Отсутствие утечек
    • void copyOf(CloneablePair p) {
    • first = p.first.clone();
    • second = p.second.clone();
    • }
    Java Advanced / Обработка ошибок и исключения
  • 39. Слабые гарантии
    • void copyOf(CloneablePair p) {
    • Cloneable temp = p.first.clone();
    • second = p.second.clone();
    • first = temp;
    • }
    Java Advanced / Обработка ошибок и исключения
  • 40. Слабые гарантии с ресурсами
    • void copyOf(CloneablePair p) {
    • Cloneable temp = p.first.clone();
    • try {
    • second = p.second.clone();
    • first = temp;
    • } catch (*Exception e) {
    • first.destroy();
    • }
    • }
    Java Advanced / Обработка ошибок и исключения
  • 41. Сильные гарантии
    • void copyOf(CloneablePair p) {
    • Cloneable temp1 = p.first.clone();
    • try {
    • Cloneable temp2 = p.second.clone();
    • try {
    • // Другие действия
    • first = temp1;
    • second = temp2;
    • } catch (*Exception e) {
    • second.destroy();
    • }
    • } catch (*Exception e) {
    • first.destroy();
    • }
    • }
    Java Advanced / Обработка ошибок и исключения
  • 42. Заключение Часть 6
  • 43. Ссылки
    • Java Tutorials. Exceptions // http://java.sun.com/docs/books/tutorial/essential/exceptions/index.html
    • Exception-Safety in Generic Components // http://www.boost.org/community/exception_safety.html
    Java Advanced / Обработка ошибок и исключения
  • 44. Вопросы Java Advanced / Обработка ошибок и исключения