エラー構成が非常に多い場合は、クラスを使用する方がはるかに簡単です。私は実際にそうプログラムは必要ありません呼び出しが(にObjCとは違って)除去することができる。このためにC++を使用しますが、このために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になるのは直感的です。 – Alerty
@Alertyは、プログラマが論理エラー(例えば、メッセージ 'nil'またはデバッグ時に初期化された初期化されたメモリを使用する)を導入したときに予測可能な値であるため、undefinedに使用されます。つまり、実際に 'MONKoalaErrorCode'のエラーがあった場合、エラーは' MONKoalaErrorCode_Undefined'を返すべきではありません。 – justin