5

CocoaとObjectiveCでは、エラーを管理するためのお気に入りのメソッドはオブジェクトを使用しているようですがNSError *、エラーオブジェクトを作成するには、次のメソッドを呼び出す必要があります。

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

私の質問は、エラーコード、ドメイン、およびユーザー情報の辞書が常に一貫性を保つように、アプリケーション全体でエラードメイン、エラーコード定義、およびユーザー情報ディクショナリを管理するためのベストプラクティスのいくつかは何ですか?

4

2 に答える 2

11

エラー構造が大量にある場合は、クラスを使用することで作業が大幅に簡素化される可能性があります。私は実際にこれに 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

次に、エラーの作成はすべてドメインごとに 1 か所で行われ、クライアントは実際に手動でエラーを作成しなくてもエラーを簡単に選択できます。

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

エラー処理は次の形式を取ります。

if ([e.domain isEqualToString:MONKoalaErrorDomain]) {
  switch (e.code) {
    case MONKoalaErrorCode_OutOfEucalyptus : {
      self.needsEucalyptus = true;
…
于 2012-02-12T05:59:28.503 に答える
3

一般的な方法の1つは、ヘッダーファイルに適切な定数を定義し、必要に応じてそのヘッダーファイルをインクルードすることです。これは非常に単純なアプローチであり、次のようになります。

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

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

また、これらを作成するための便利なメソッドを、カテゴリとして、NSErrorまたは個別のユーティリティクラスまたは関数のセットとして作成するアプリケーションもいくつか見ました。NSErrorたとえば、ローカライズされた説明をカスタマイズするために、サブクラス化することも完全に合理的です。

まだご覧になっていない場合は、Appleがエラー処理プログラミングガイドをリリースしました。このガイドでは、Cocoaでこれらをどのように使用するかについて説明しています。

于 2012-02-12T02:41:12.743 に答える