Если у вас есть огромное количество ошибок, ваша жизнь может быть намного проще с помощью класса. Я использую 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;
…
Просто небольшой комментарий: в то время как код ошибки NSError не должен смешиваться с кодом выхода программы, я нахожу его интуитивно понятным, чтобы иметь код ошибки, равный 0. Я предпочитаю иметь -1 для неопределенной ошибки. – Alerty
@Alerty '0' используется для неопределенного, потому что это более предсказуемое значение, когда программист вводит логическую ошибку (например, сообщения« nil »или использует инициализированную память по умолчанию при отладке). то есть ошибка никогда не должна возвращать 'MONKoalaErrorCode_Undefined', если это действительно ошибка' MONKoalaErrorCode'. – justin