2012-02-12 3 views
5

в какао и Objective C любимого метод для управления ошибкой, кажется, использует NSError * объекта, построить объект ошибки, однако, необходимо вызвать следующий методсписка кодов ошибок Управления для NSError в Objective C

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

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

ответ

10

Если у вас есть огромное количество ошибок, ваша жизнь может быть намного проще с помощью класса. Я использую 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; 
… 
+1

Просто небольшой комментарий: в то время как код ошибки NSError не должен смешиваться с кодом выхода программы, я нахожу его интуитивно понятным, чтобы иметь код ошибки, равный 0. Я предпочитаю иметь -1 для неопределенной ошибки. – Alerty

+0

@Alerty '0' используется для неопределенного, потому что это более предсказуемое значение, когда программист вводит логическую ошибку (например, сообщения« nil »или использует инициализированную память по умолчанию при отладке). то есть ошибка никогда не должна возвращать 'MONKoalaErrorCode_Undefined', если это действительно ошибка' MONKoalaErrorCode'. – justin

3

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

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

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

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

Если вы еще этого не видели, Apple выпустила Error Handling Programming Guide, в котором обсуждается, как они должны использоваться в Cocoa.

+0

ах, руководство по обработке ошибок действительно полезно. благодаря! – Tony

Смежные вопросы