Ошибочные респонденты и восстановление после ошибки

Как, Почему Имеют Ошибочные Объекты? указывает, NSError объекты приносят значительные преимущества для программирования Какао. Но платформы Какао также дают NSError возражает видной роли для игры в архитектуре для ошибочного представления и восстановления после ошибки. Эта архитектура улучшает полноценность ошибочных объектов. Они позволяют приложениям Какао подарить пользователям более богатое и больше настраиваемого диапазона сообщений, и делать попытку восстановления после ошибок, а также информирования пользователей их.

Цепочка ошибочного респондента

Набор Приложения, в основном через NSResponder класс, определяет механизм, известный как цепочка респондента, которой от событий и сообщения действия в приложении отказываются иерархия представления к окнам и в конечном счете к объекту приложения. Набор Приложения определяет подобную цепочку объектов для обработки ошибок и представления.

Инициировать поездку NSError возразите цепочке ошибочного респондента, можно отправить одно из двух сообщений к любому объекту в цепочке:

Несмотря на то, что эти методы объявляются NSResponder класс, можно также отправить их в объекты NSDocument и NSDocumentController классы. ( NSResponder класс является суперклассом, конечно, NSView, NSWindow, NSApplication, и NSWindowController классы.)

Поведение по умолчанию обоих presentError:... методы — за исключением NSApplication реализация — должна отправить willPresentError: к self прежде, чем передать presentError:.. обменивайтесь сообщениями к следующему объекту в цепочке. Подклассы могут реализовать willPresentError: метод для проверки переданного - в NSError возразите и возвратите специализированный объект. Подклассы могли бы хотеть сделать это, если они знают больше, чем свой суперкласс об условиях, дающих начало ошибке или если они знают лучше всего, как восстановиться с него.

В целях иллюстрации предположите, что представление возражает хорошо вниз, что иерархия представления получает presentError: сообщение. Поскольку рисунок 3-1 показывает, он отправляет willPresentError: к self и затем отправляет presentError: к его суперпредставлению, передавая его любой измененный NSError объект. Суперпредставления инициирующего представления делают ту же вещь до наконец, представление содержания окна отправляет presentError: обменивайтесь сообщениями к его объекту окна.

Рисунок 3-1  цепочка ошибочного респондента — часть один
The error-responder chain—part one

presentError: обменивайтесь сообщениями продолжает цепочку ошибочных респондентов этим способом, пока это не достигает глобального объекта приложения, NSApp. Поскольку рисунок 3-2 изображает, NSApp отправляет application:willPresentError: обменивайтесь сообщениями его делегату, давая ему ту же возможность, как объекты подкласса в цепочке для проверки ошибки возражают и возможно изменяют его — но без потребности в пользовательском подклассе. Когда делегат возвращается, NSApp выводит на экран ошибку как (в этом случае) предупредительное диалоговое окно.

Рисунок 3-2  цепочка ошибочного респондента — часть два
The error-responder chain — part twoThe error-responder chain — part two

Точная последовательность объектов в цепочке ошибочного респондента варьируется согласно типу приложения. Для основанных на документе приложений цепочка ошибочного респондента включает объекты документа, контроллеры окна, и контроллеры документа, а также представления, окна и NSApp (рисунок 3-3).

  Цепочка Ошибочного респондента рисунка 3-3 для основанных на документе приложений
Error-responder chain for coument-based applications

Некоторые приложения Какао не основаны на документе, но все еще используют один или несколько контроллеров окна. Рисунок 3-4 показывает последовательность объектов в этой цепочке ошибочного респондента.

  Цепочка Ошибочного респондента рисунка 3-4 для приложений недокумента с контроллерами окна
Error-responder chain for non-document applications with window controllersError-responder chain for non-document applications with window controllers

Наконец, простые приложения Какао — те, которые не основаны на документе и которые не используют контроллеры окна — сделали, чтобы ошибочный респондент упорядочил, как изображено на рисунке 3-5.

  Цепочка Ошибочного респондента рисунка 3-5 для простого (недокумент) приложения
Error-responder chain for simple (non-document) applications

Ошибочная настройка

Как описано в предыдущем разделе, все время по цепочке ошибочного респондента пользовательским подклассам объектов в цепочке дают возможность проверить и настроить NSError возразите, реализуют ли они willPresentError: метод. Около конца цепочки у делегата приложения есть та же возможность в application:willPresentError:. Какие тесты и настройки могут иметь место в этих методах?

В любом методе Вы, вероятно, сначала хотите определить, какова ошибка. При выполнении этого протестируйте NSError домен объекта и код ошибки против констант, вероятно, связанных с состоянием ошибки. Не оценивайте описание или строки восстановления, поскольку они могут варьироваться, особенно когда они локализуются. Вы могли бы также сузить причину ошибки при помощи проблемно-ориентированных ключей для извлечения различных данных из пользовательского информационного словаря.

Вы могли бы также хотеть узнать, имеет ли ошибочный объект базовую ошибку; можно получить доступ к этому объекту из пользовательского информационного словаря с NSUnderlyingErrorKey ключ. Если существует базовая ошибка, и этот объект имеет причину отказа в своем пользовательском информационном словаре, можно добавить эту локализованную строку к описанию ошибки для создания более информативного описания.

Если Вы решаете, что знаете, как восстановиться с ошибки, можно добавить объект к пользовательскому информационному словарю как восстановление attempter. Для восстановления attempter, чтобы быть эффективным, это должно удовлетворить требования, полученные в итоге в Восстановлении после ошибки.

Если Вы настраиваете полученный NSError объект иметь пользовательский ошибочный домен и код ошибки, можно принять решение сохранить исходную ошибку в пользовательском информационном словаре как базовая ошибка. Используйте ключ NSUnderlyingErrorKey с этой целью (или переопределение recoveryAttempter метод).

Вы не можете изменить полученный NSError возразите, потому что класс не обеспечивает методов установщика, и пользовательский информационный словарь является неизменным. При настройке ошибки необходимо создать новое NSError объект, инициализирующий с новыми данными плюс данные от старой ошибки, возражает, что Вы хотите перенести. Посмотрите Используя и Ошибочные Объекты Создания для явных инструкций и примеров.

Восстановление после ошибки

Восстановление attempter является объектом, определяемым для попытки, по пользовательскому запросу, восстановлению после определенной ошибки. Например, скажите, что программа не может сохранить файл, потому что она заблокирована. Восстановление attempter могло попытаться разблокировать его сначала прежде, чем перезаписать его.

Механизм восстановления после ошибки подобен шаблону разработки делегации в этом заданный объект — восстановление attempter — просят реагировать на пользовательское действие. NSError объект может инкапсулировать восстановление attempter и опции восстановления, который является массивом заголовков кнопки для отображения на ошибочном предупреждении. Среди кнопки заголовки одно восстановление после ошибки запроса. Когда ошибочное предупреждение выведено на экран, и пользователь нажимает кнопку, приложение отправляет сообщение в восстановление attempter, передавая его индекс нажатой кнопки. Если «восстановить» кнопка была нажата, восстановление attempter пытается завершить работу в пути, избегающем ошибки или фиксирующем условие, дающее начало ему. Наконец, восстановление attempter сообщает или объекту приложения или модальному документом делегату листа, было ли это успешно.

Существует три требования для восстановления после ошибки для появления в результате пользовательского выбора:

Для полной процедуры для восстановления после ошибки, включая пример кода, посмотрите Восстановление С Ошибок.