Я лично использую домен в стиле обратного DNS. Например:
NSError * myInternalError = [NSError errorWithDomain:@"com.davedelong.myproject" code:42 userInfo:someUserInfo];
Третья часть домена ( @"myproject"
) используется только для того, чтобы отличать ошибки этого проекта ( "My Project"
) от ошибок другого проекта ( "My Other Project"
=> com.davedelong.myotherproject
).
Это простой способ убедиться, что я не собираюсь конфликтовать с чужими доменами ошибок (если я использую сторонний код), если только этот разработчик целенаправленно не пытается связываться только со мной (что, я считаю, маловероятно. ..).
Что касается конфликтов нумерации кодов, не беспокойтесь об этом. Если коды в домене уникальны , все должно быть в порядке.
Что касается ошибок перевода, решать вам. Что бы вы ни делали, обязательно хорошо документируйте это. Лично я обычно просто передаю ошибки, сгенерированные фреймворком, по мере их появления, поскольку я никогда не уверен, что обработаю все коды и переведу все данные userInfo в нечто более специфичное для моего проекта. Фреймворки могут изменяться и добавлять больше кодов, или изменять значение существующих кодов и т. Д. Это также помогает мне более точно определить, откуда возникла ошибка. Например, если мой фреймворк StackKit генерирует ошибку в com.stackkit
домене, я знаю, что это проблема фреймворка. Однако, если в файле возникает ошибка NSURLErrorDomain
, значит, я знаю, что это произошло именно из-за механизма загрузки URL-адреса.
Что вы можете сделать, так это зафиксировать ошибку, сгенерированную фреймворком, и обернуть ее в новый объект ошибки, содержащий ваш домен и общий код, что-то вроде kFrameworkErrorCodeUnknown
или что-то в этом роде, а затем поместить зафиксированную ошибку в файл userInfo
под NSUnderlyingErrorKey
. CoreData делает это часто (например, если вы попытаетесь save:
создать NSManagedObjectContext
, но у вас есть ошибки целостности отношений, вы получите одну ошибку, но она NSUnderlyingErrorKey
будет содержать гораздо больше информации, например, какие именно отношения неверны и т. Д.).
У меня недостаточно комментариев, чтобы прокомментировать, но для принятого ответа Дэйва ДеЛонга, возможно, было бы немного лучше использовать
[[NSBundle mainBundle] bundleIdentifier]
вместо@"com.myName.myProject"
. Таким образом, если вы измените свое имя или название проекта, оно будет отображаться точно.источник
NSBundle.mainBundle().bundleIdentifier!
(если вы знаете, что идентификатор пакета установлен, что, я думаю, будет наиболее вероятно)Как создать собственный NSError:
Сначала создайте словарь сообщения об ошибке
Затем назначьте userInfo NSDictionary и готово.
источник