Лучшая практика-домены и коды NSError для вашего собственного проекта / приложения


существует предыдущее сообщение SO о настройке доменов ошибок для ваших собственных фреймворков, но какова лучшая практика в отношении настройки доменов ошибок и пользовательских кодов ошибок для вашего собственного проекта/приложения?

например, предположим, что вы работаете над приложением Core Data-intensive с большим количеством проверок, если вы просто придерживаетесь кодов ошибок Core Data "с полки" (например,NSManagedObjectValidationError с CoreDataErrors.h) или вы должны создать свой собственный MyAppErrors.h и определить ошибки с большей конкретностью (т. е. MyAppValidationErrorInvalidCombinationOfLimbs?

создание пользовательского домена ошибок и набора кодов ошибок может значительно устранить неоднозначность вашего кода, но слишком ли много накладных расходов для поддержания и нужно ли беспокоиться о конфликтах нумерации кодов ошибок? Или есть другие предложения?

3 102

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: an NSManagedObjectContext, но у вас есть ошибки целостности отношений, вы получите одну ошибку, но 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.