Exceptions

502 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
502
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

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

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

    ×