Ошибочные респонденты и восстановление после ошибки
Как, Почему Имеют Ошибочные Объекты? указывает, NSError
объекты приносят значительные преимущества для программирования Какао. Но платформы Какао также дают NSError
возражает видной роли для игры в архитектуре для ошибочного представления и восстановления после ошибки. Эта архитектура улучшает полноценность ошибочных объектов. Они позволяют приложениям Какао подарить пользователям более богатое и больше настраиваемого диапазона сообщений, и делать попытку восстановления после ошибок, а также информирования пользователей их.
Цепочка ошибочного респондента
Набор Приложения, в основном через NSResponder
класс, определяет механизм, известный как цепочка респондента, которой от событий и сообщения действия в приложении отказываются иерархия представления к окнам и в конечном счете к объекту приложения. Набор Приложения определяет подобную цепочку объектов для обработки ошибок и представления.
Инициировать поездку NSError
возразите цепочке ошибочного респондента, можно отправить одно из двух сообщений к любому объекту в цепочке:
presentError:
— для сообщений об ошибках, выведенных на экран в модальных приложением предупредительных диалоговых окнахpresentError:modalForWindow:delegate:didPresentSelector:contextInfo:
— для сообщений об ошибках, выведенных на экран в модальных документом предупредительных листах
Несмотря на то, что эти методы объявляются NSResponder
класс, можно также отправить их в объекты NSDocument
и NSDocumentController
классы. ( NSResponder
класс является суперклассом, конечно, NSView
, NSWindow
, NSApplication
, и NSWindowController
классы.)
Поведение по умолчанию обоих presentError:...
методы — за исключением NSApplication
реализация — должна отправить willPresentError:
к self
прежде, чем передать presentError:..
обменивайтесь сообщениями к следующему объекту в цепочке. Подклассы могут реализовать willPresentError:
метод для проверки переданного - в NSError
возразите и возвратите специализированный объект. Подклассы могли бы хотеть сделать это, если они знают больше, чем свой суперкласс об условиях, дающих начало ошибке или если они знают лучше всего, как восстановиться с него.
В целях иллюстрации предположите, что представление возражает хорошо вниз, что иерархия представления получает presentError:
сообщение. Поскольку рисунок 3-1 показывает, он отправляет willPresentError:
к self
и затем отправляет presentError:
к его суперпредставлению, передавая его любой измененный NSError
объект. Суперпредставления инициирующего представления делают ту же вещь до наконец, представление содержания окна отправляет presentError:
обменивайтесь сообщениями к его объекту окна.
presentError:
обменивайтесь сообщениями продолжает цепочку ошибочных респондентов этим способом, пока это не достигает глобального объекта приложения, NSApp. Поскольку рисунок 3-2 изображает, NSApp отправляет application:willPresentError:
обменивайтесь сообщениями его делегату, давая ему ту же возможность, как объекты подкласса в цепочке для проверки ошибки возражают и возможно изменяют его — но без потребности в пользовательском подклассе. Когда делегат возвращается, NSApp выводит на экран ошибку как (в этом случае) предупредительное диалоговое окно.
Точная последовательность объектов в цепочке ошибочного респондента варьируется согласно типу приложения. Для основанных на документе приложений цепочка ошибочного респондента включает объекты документа, контроллеры окна, и контроллеры документа, а также представления, окна и NSApp (рисунок 3-3).
Некоторые приложения Какао не основаны на документе, но все еще используют один или несколько контроллеров окна. Рисунок 3-4 показывает последовательность объектов в этой цепочке ошибочного респондента.
Наконец, простые приложения Какао — те, которые не основаны на документе и которые не используют контроллеры окна — сделали, чтобы ошибочный респондент упорядочил, как изображено на рисунке 3-5.
Ошибочная настройка
Как описано в предыдущем разделе, все время по цепочке ошибочного респондента пользовательским подклассам объектов в цепочке дают возможность проверить и настроить NSError
возразите, реализуют ли они willPresentError:
метод. Около конца цепочки у делегата приложения есть та же возможность в application:willPresentError:
. Какие тесты и настройки могут иметь место в этих методах?
В любом методе Вы, вероятно, сначала хотите определить, какова ошибка. При выполнении этого протестируйте NSError
домен объекта и код ошибки против констант, вероятно, связанных с состоянием ошибки. Не оценивайте описание или строки восстановления, поскольку они могут варьироваться, особенно когда они локализуются. Вы могли бы также сузить причину ошибки при помощи проблемно-ориентированных ключей для извлечения различных данных из пользовательского информационного словаря.
Вы могли бы также хотеть узнать, имеет ли ошибочный объект базовую ошибку; можно получить доступ к этому объекту из пользовательского информационного словаря с NSUnderlyingErrorKey
ключ. Если существует базовая ошибка, и этот объект имеет причину отказа в своем пользовательском информационном словаре, можно добавить эту локализованную строку к описанию ошибки для создания более информативного описания.
Если Вы решаете, что знаете, как восстановиться с ошибки, можно добавить объект к пользовательскому информационному словарю как восстановление attempter. Для восстановления attempter, чтобы быть эффективным, это должно удовлетворить требования, полученные в итоге в Восстановлении после ошибки.
Если Вы настраиваете полученный NSError
объект иметь пользовательский ошибочный домен и код ошибки, можно принять решение сохранить исходную ошибку в пользовательском информационном словаре как базовая ошибка. Используйте ключ NSUnderlyingErrorKey
с этой целью (или переопределение recoveryAttempter
метод).
Вы не можете изменить полученный NSError
возразите, потому что класс не обеспечивает методов установщика, и пользовательский информационный словарь является неизменным. При настройке ошибки необходимо создать новое NSError
объект, инициализирующий с новыми данными плюс данные от старой ошибки, возражает, что Вы хотите перенести. Посмотрите Используя и Ошибочные Объекты Создания для явных инструкций и примеров.
Восстановление после ошибки
Восстановление attempter является объектом, определяемым для попытки, по пользовательскому запросу, восстановлению после определенной ошибки. Например, скажите, что программа не может сохранить файл, потому что она заблокирована. Восстановление attempter могло попытаться разблокировать его сначала прежде, чем перезаписать его.
Механизм восстановления после ошибки подобен шаблону разработки делегации в этом заданный объект — восстановление attempter — просят реагировать на пользовательское действие. NSError
объект может инкапсулировать восстановление attempter и опции восстановления, который является массивом заголовков кнопки для отображения на ошибочном предупреждении. Среди кнопки заголовки одно восстановление после ошибки запроса. Когда ошибочное предупреждение выведено на экран, и пользователь нажимает кнопку, приложение отправляет сообщение в восстановление attempter, передавая его индекс нажатой кнопки. Если «восстановить» кнопка была нажата, восстановление attempter пытается завершить работу в пути, избегающем ошибки или фиксирующем условие, дающее начало ему. Наконец, восстановление attempter сообщает или объекту приложения или модальному документом делегату листа, было ли это успешно.
Существует три требования для восстановления после ошибки для появления в результате пользовательского выбора:
Объект восстановления-attempter должен реализовать один из
NSErrorRecoveryAttempting
неофициальные методы протокола:attemptRecoveryFromError:optionIndex:delegate:didRecoverSelector:contextInfo:
илиattemptRecoveryFromError:optionIndex:
В зависимости от того, является ли ошибочное предупреждение документом-modall (лист) или модальный приложением (диалоговое окно), соответственно.recoveryAttempter
метод должен возвратить подходящий объект. Для обеспечения этого можно добавить восстановление attempter к пользовательскому информационному словарю как значениеNSRecoveryAttempterErrorKey
, или можно переопределитьrecoveryAttempter
метод.localizedRecoveryOptions
должен возвратить массив заголовков кнопки (включая заголовок кнопки, запрашивающей восстановление после ошибки). Для обеспечения этого можно добавить массив к пользовательскому информационному словарю как значениеNSLocalizedRecoveryOptionsErrorKey
, или можно переопределитьlocalizedRecoveryOptions
метод.
Для полной процедуры для восстановления после ошибки, включая пример кода, посмотрите Восстановление С Ошибок.