Управление списком кодов ошибок для NSError в цели c - PullRequest
5 голосов
/ 12 февраля 2012

В Какао и Цели C предпочтительный метод управления ошибками, кажется, использует объект NSError *, для создания объекта ошибки, однако нам нужно вызвать следующий метод

+ (id)errorWithDomain:(NSString *)domain code:(NSInteger)code userInfo:(NSDictionary *)dict

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

Ответы [ 2 ]

11 голосов
/ 12 февраля 2012

Если у вас есть большое количество ошибок, ваша жизнь может быть намного проще, если использовать класс.Я фактически использую C ++ для этого, поэтому вызовы, которые не нужны программе, могут быть удалены (в отличие от objc), но вы можете использовать для этого C, ObjC или C ++:

MONErrorDomain.h

// you won't normally need an instance here
@interface MONErrorDomain : NSObject

+ (NSString *)domain; // << required override
- (NSString *)domain; // << returns [[self class] domain]

// example convenience methods:
// uses [self domain]
+ (NSError *)errorWithErrorCode:(NSInteger)errorCode; // << user info would be nil
+ (NSError *)errorWithErrorCode:(NSInteger)errorCode userInfo:(NSDictionary *)userInfo;

@end

MONKoalaError.h

@interface MONKoalaError : MONErrorDomain

+ (NSError *)outOfEucalyptus;

@end

extern NSString * const MONKoalaErrorDomain;

typedef enum MONKoalaErrorCode {
  MONKoalaErrorCode_Undefined = 0,
  MONKoalaErrorCode_OutOfEucalyptus
} MONKoalaErrorCode;

MONKoalaError.m

// apple recommends we use reverse domains
NSString * const MONKoalaErrorDomain = @"com.mon.koala-library.MONKoalaErrorDomain";

@implementation MONKoalaError

+ (NSString *)domain
{
  return MONKoalaErrorDomain;
}

+ (NSError *)outOfEucalyptus
{
  NSDictionary * info = …;
  return [self errorWithErrorCode:MONKoalaErrorCode_OutOfEucalyptus userInfo:info];
}

@end

Тогда создание ошибкивсе в одном месте для каждого домена, и клиенты могут легко выбирать свои ошибки, фактически не создавая их вручную:

if (outError) {
  *outError = [MONKoalaError outOfEucalyptus];
}

и обработка ошибок принимает форму:

if ([e.domain isEqualToString:MONKoalaErrorDomain]) {
  switch (e.code) {
    case MONKoalaErrorCode_OutOfEucalyptus : {
      self.needsEucalyptus = true;
…
3 голосов
/ 12 февраля 2012

Одним из распространенных способов является определение некоторых соответствующих констант в файле заголовка, а затем включение этого файла заголовка, где это необходимо.Это довольно простой подход, который выглядит следующим образом:

const NSString * kMyAppErrorDomain = @"com.example.myapp";
const NSInteger kMyAppSomeError = 2;

// key into user info dictionary
const NSString * kMyAppProblemKey = @"MyAppProblemKey";

Я также видел несколько приложений, которые создают удобные методы для их создания, либо в виде категории на NSError, либо в виде отдельного служебного класса или наборафункций.Также вполне разумно использовать подкласс NSError, например, для настройки локализованного описания.

Если вы его еще не видели, Apple выпустила Руководство по программированию обработки ошибок , в котором обсуждается, как этиследует использовать в какао.

...