2012-02-12 4 views
5

エラーを管理するためのお気に入りの方法は、しかし、我々は次のような方法Objective Cの中でNSErrorのエラーコードのリストを管理する

+ (id)errorWithDomain:(NSString *)domain code:(NSInteger)code userInfo:(NSDictionary *)dict 
を呼び出す必要があり、エラーオブジェクトを構築するために、 NSError *オブジェクトを使用しているように見えます

私の質問は、アプリケーション全体でエラードメイン、エラーコード定義、ユーザー情報辞書を管理するためのベストプラクティスは何ですか?エラーコード、ドメイン、ユーザー情報のdictは常に一貫していますか?

答えて

10

エラー構成が非常に多い場合は、クラスを使用する方がはるかに簡単です。私は実際にそうプログラムは必要ありません呼び出しが(に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; 
… 
+1

ちょっとしたコメント:NSErrorエラーコードはプログラムの終了コードで混乱させるべきではありませんが、エラーコードが0になるのは直感的です。 – Alerty

+0

@Alertyは、プログラマが論理エラー(例えば、メッセージ 'nil'またはデバッグ時に初期化された初期化されたメモリを使用する)を導入したときに予測可能な値であるため、undefinedに使用されます。つまり、実際に 'MONKoalaErrorCode'のエラーがあった場合、エラーは' MONKoalaErrorCode_Undefined'を返すべきではありません。 – justin

3

一般的な方法の1つは、ヘッダーファイルにいくつかの適切な定数を定義し、必要に応じてそのヘッダーファイルを含めることです。それはかなり単純なアプローチだと、次のようになります。私もNSError上のカテゴリとして、あるいは別のユーティリティクラスや関数の集合としてのいずれかで、これらを作成するための便利なメソッドを作成するいくつかのアプリケーションを見てきました

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

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

。ローカライズされた説明をカスタマイズするなど、NSErrorをサブクラス化することも全く妥当です。

まだご覧になっていない場合、AppleはError Handling Programming Guideをリリースし、これを使用してCocoaを使用する方法について説明しています。

+0

ああ、エラー処理ガイドは本当に役に立ちます。ありがとう! – Tony

関連する問題