Software Design Поведение при сбоях Бреслав А. А. Контракт Метод Предусловие – обязанности среды Постусловие – обязанности метода Класс Инвариант – неявное дополнение к предусловию и постусловию.
Download ReportTranscript Software Design Поведение при сбоях Бреслав А. А. Контракт Метод Предусловие – обязанности среды Постусловие – обязанности метода Класс Инвариант – неявное дополнение к предусловию и постусловию.
Бреслав А. А.
Software Design
Поведение при сбоях
Контракт
Метод Предусловие – обязанности среды Постусловие – обязанности метода Класс Инвариант – неявное дополнение к предусловию и постусловию каждого метода Паттерны проектирования. Введение Бреслав А. А.
Когда контракт нарушается
Нарушено постусловие Метод не выполнил контракт Ошибка в коде метода Нарушено предусловие Окружение метода не выполнило контракт Возможно, ошибка в коде окружения Возможно, поступили некорректные данные Пользователь Ненадежные каналы передачи … Бреслав А. А.
Паттерны проектирования. Введение
Вечные вопросы
Нарушено постусловие Кто виноват?
Программист
Что делать?
Исправлять код метода
(или ДНК… ) Нарушено предусловие Кто виноват?
Неизвестно
Что делать?
Бросить исключение
Паттерны проектирования. Введение Бреслав А. А.
Когда использовать исключения
Когда обнаружено нарушение контракта метода В этом случае происходит программный сбой: метод не может нормально работать Когда обнаружен сбой во внешней среде Иногда это делается помимо программиста (IOException) Паттерны проектирования. Введение Бреслав А. А.
Золотое правило
НЕ НУЖНО ИСПОЛЬЗОВАТЬ ОБРАБОТКУ ИСКЛЮЧЕНИЙ, КОГДА НЕТ СБОЯ для изощренных переходов (вместо goto) для обмена данными между различными частями приложения для избавления от проблем с нулевыми ссылками Паттерны проектирования. Введение Бреслав А. А.
Исключения в Java
Runtime Нарушение контракта, которое клиент мог предсказать (NPE, Division by zero, NumberFormatException, ClassCastException) вот зачем нужно, чтобы внешние клиенты могли вычислить значение предусловия Checked Нарушение контракта внешней средой, которого клиент предсказать не мог или это было слишком сложно (IOException) Error Исключения уровня виртуальной машины Никогда не нужно бросать или ловить Error Паттерны проектирования. Введение Бреслав А. А.
Исключения – часть сигнатуры
Должно быть известно, какие исключения может бросить метод, и когда если предусловие выписано явно, эта информация сопровождает предусловие Стоит указывать в предложении throws не только Checked, но и Runtime исключения Паттерны проектирования. Введение Бреслав А. А.
Обработка исключений
Полнота Блок обработки сам не бросает никаких исключений Своевременность Блок обработки захватывает только код, связанный с исключением Исключение обрабатывается на своем уровне абстракции Паттерны проектирования. Введение Бреслав А. А.
Уровни абстракции при обработке исключений
Пользователь пытается сохранить изменения в файл на сетевом диске Произошел сбой и доступ к сети пропал Причина ошибки: время ожидания истекло Странно сообщать пользователю, который пытался сохранить файл, что время ожидания
истекло
Нужно сообщить, что не удалось сохранить файл из-за сбоя в сети Эти ошибки имеют одну причину, но находятся на разных уровнях абстракции
Паттерны проектирования. Введение Бреслав А. А.
Заворачивание исключений
Изменение уровня абстракции Поймать низкоуровневое исключение Завернуть его в высокоуровневое Бросить высокоуровневое Приведение к наследуемой сигнатуре Библиотека регламентирует сигнатуру Checked исключения приходится заворачивать Паттерны проектирования. Введение Бреслав А. А.
Избавление от checked исключений
Завернуть checked исключение в runtime исключение Опасно: нарушается семантика Бывает необходимо Это сигнал к тому, что что-то делается не там, где надо Паттерны проектирования. Введение Бреслав А. А.
Классы исключений
Информативность как минимум, отражение уровня абстракции достаточная информация для обнаружения причин сбоя для этого часто создаются собственные классы checked исключений Создавать свои классы runtime исключений нужно редко Паттерны проектирования. Введение Бреслав А. А.
Стандартные классы исключений
IllegalArgumentException IllegalStateException IndexOutOfBoundsException UnsupportedOperationException Не стоит использовать NullPointerException ClassCastException Паттерны проектирования. Введение Бреслав А. А.
Быстродействие
Бросание исключения занимает время заполняется stack trace вычисляется точка, куда передается управление Обработка исключения дает дополнительную нагрузку на код, внутри блока try Паттерны проектирования. Введение Бреслав А. А.
Взаимодействие с пользователем
Закрыться молча Сообщить об ошибке и закрыться Сообщить об ошибке и отменить текущую операцию Запросить корректировку данных Скорректировать данные самостоятельно Паттерны проектирования. Введение Бреслав А. А.
Принцип наименьшего удивления
Пользователь, по возможности, не должен получать результаты, которых он не ожидает или не может понять Информативные сообщения об ошибках Сообщения, рассчитанные на определенный уровень подготовки пользователя (чем меньше, тем лучше) Предоставление возможно более полной информации Паттерны проектирования. Введение Бреслав А. А.
Сбор информации о сбоях
Информацию о сбоях лучше всего накапливать и анализировать, чтобы выявить ошибки, приводящие к сбоям или улучшить usability log файлы автоматизированные отчеты об ошибках Паттерны проектирования. Введение Бреслав А. А.
Источники
Джошуа Блох, Java™. Эффективное программирование / Пер. с англ. – М.: Лори, 2002 Мейер Б., Объектно-ориентированное конструирование программных систем / Пер. с англ. – М. : Издательско-торговый дом «Русская редакция», 2005 – 1232 стр. : ил. Джоэл Спольски, Джоэл о программировании… – СПб: Символ-Плюс, 2006 – 352 с., ил.
Паттерны проектирования. Введение Бреслав А. А.
Задание
Создать класс для стека чисел, хранимого в файле Описать контракт каждого метода Обратить внимание на типы исключений Бреслав А. А.
Паттерны проектирования. Введение
Вопросы
Бреслав А. А.
Паттерны проектирования. Введение