Objective-c-error-handling

提供:Dev Guides
移動先:案内検索

Objective-Cエラー処理

Objective-Cプログラミングでは、* Foundationフレームワークで使用可能なNSErrorクラスでエラー処理が提供されます。*

NSErrorオブジェクトは、エラーコードまたはエラー文字列のみを使用した場合よりも豊富で拡張可能なエラー情報をカプセル化します。 NSErrorオブジェクトのコア属性は、エラードメイン(文字列で表される)、ドメイン固有のエラーコード、およびアプリケーション固有の情報を含むユーザー情報辞書です。

NSError

Objective-CプログラムはNSErrorオブジェクトを使用して、ユーザーに通知する必要があるランタイムエラーに関する情報を伝えます。 ほとんどの場合、プログラムはこのエラー情報をダイアログまたはシートに表示します。 ただし、情報を解釈して、ユーザーにエラーからの回復を試みるか、エラーの修正を試みることもできます。

NSErrorオブジェクトは-

  • ドメイン-エラードメインは、事前定義されたNSErrorドメインのいずれかであるか、カスタムドメインを記述する任意の文字列であり、ドメインがnilであってはなりません。
  • コード-エラーのエラーコード。
  • ユーザー情報-エラーおよびuserInfoのuserInfo辞書はnilである可能性があります。

次の例は、カスタムエラーを作成する方法を示しています

NSString *domain = @"com.MyCompany.MyApplication.ErrorDomain";
NSString *desc = NSLocalizedString(@"Unable to complete the process", @"");
NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : desc };
NSError *error = [NSError errorWithDomain:domain code:-101 userInfo:userInfo];

これは、ポインタへの参照として渡される上記のエラーサンプルの完全なコードです-

#import <Foundation/Foundation.h>

@interface SampleClass:NSObject
-(NSString *) getEmployeeNameForID:(int) id withError:(NSError **)errorPtr;
@end

@implementation SampleClass

-(NSString *) getEmployeeNameForID:(int) id withError:(NSError **)errorPtr {
   if(id == 1) {
      return @"Employee Test Name";
   } else {
      NSString *domain = @"com.MyCompany.MyApplication.ErrorDomain";
      NSString *desc =@"Unable to complete the process";
      NSDictionary *userInfo = [[NSDictionary alloc]
      initWithObjectsAndKeys:desc,
      @"NSLocalizedDescriptionKey",NULL];
      *errorPtr = [NSError errorWithDomain:domain code:-101
      userInfo:userInfo];
      return @"";
   }
}

@end

int main() {
   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
   SampleClass* sampleClass = [[SampleClass alloc]init];
   NSError *error = nil;
   NSString *name1 = [sampleClass getEmployeeNameForID:1 withError:&error];

   if(error) {
      NSLog(@"Error finding Name1: %@",error);
   } else {
      NSLog(@"Name1: %@",name1);
   }

   error = nil;
   NSString *name2 = [sampleClass getEmployeeNameForID:2 withError:&error];

   if(error) {
      NSLog(@"Error finding Name2: %@",error);
   } else {
      NSLog(@"Name2: %@",name2);
   }

   [pool drain];
   return 0;
}

上記の例では、idが1の場合、名前を返します。それ以外の場合、ユーザー定義のエラーオブジェクトを設定します。

上記のコードをコンパイルして実行すると、次の結果が生成されます-

2013-09-14 18:01:00.809 demo[27632] Name1: Employee Test Name
2013-09-14 18:01:00.809 demo[27632] Error finding Name2: Unable to complete the process