Лучшая практика-домены и коды NSError для вашего собственного проекта / приложения
существует предыдущее сообщение SO о настройке доменов ошибок для ваших собственных фреймворков, но какова лучшая практика в отношении настройки доменов ошибок и пользовательских кодов ошибок для вашего собственного проекта/приложения?
например, предположим, что вы работаете над приложением Core Data-intensive с большим количеством проверок, если вы просто придерживаетесь кодов ошибок Core Data "с полки" (например,NSManagedObjectValidationError
с CoreDataErrors.h
) или вы должны создать свой собственный MyAppErrors.h
и определить ошибки с большей конкретностью (т. е. MyAppValidationErrorInvalidCombinationOfLimbs
?
создание пользовательского домена ошибок и набора кодов ошибок может значительно устранить неоднозначность вашего кода, но слишком ли много накладных расходов для поддержания и нужно ли беспокоиться о конфликтах нумерации кодов ошибок? Или есть другие предложения?
3 ответа:
Я лично использую домен в стиле обратного 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 механизм.что ты может do это захватить фреймворк генерируется ошибка и обернуть его в новый объект ошибки, который имеет свой домен и общий код, что-то вроде
kFrameworkErrorCodeUnknown
или что-то еще, а затем поместите захваченную ошибку вuserInfo
подNSUnderlyingErrorKey
. CoreData делает это много (например, если вы пытаетесьsave:
anNSManagedObjectContext
, но у вас есть ошибки целостности отношений, вы получите одну ошибку, ноNSUnderlyingErrorKey
будет содержать гораздо больше информации, например, какие именно отношения являются неправильными и т. д.).
у меня недостаточно репутации, чтобы комментировать, но для принятого ответа Дэйва Делонга может быть немного лучше использовать
[[NSBundle mainBundle] bundleIdentifier]
вместо@"com.myName.myProject"
. Таким образом, если вы измените свое имя или название проекта, оно будет отражено точно.
Как создать пользовательский NSError:
кулак создать словарь сообщения об ошибке
NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: NSLocalizedString(@"Unknown Error - Please try again", nil), NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"Unknown Error - Please try again", nil), NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Unknown Error - Please try again", nil) }; NSError *error = [NSError errorWithDomain:@"com.yourdomain.bundleidentifier" code:-58 userInfo:userInfo];
затем назначьте userInfo для NSDictionary и вашего done.