Objective-Cのエラー処理
Objective-Cプログラミングでは、エラー処理はで利用可能なNSErrorクラスで提供されます Foundation framework.
NSErrorオブジェクトは、エラーコードまたはエラー文字列のみを使用して可能であるよりも豊富で拡張可能なエラー情報をカプセル化します。NSErrorオブジェクトのコア属性は、エラードメイン(文字列で表される)、ドメイン固有のエラーコード、およびアプリケーション固有の情報を含むユーザー情報ディクショナリです。
NSError
Objective-Cプログラムは、NSErrorオブジェクトを使用して、ユーザーに通知する必要のあるランタイムエラーに関する情報を伝達します。ほとんどの場合、プログラムはこのエラー情報をダイアログまたはシートに表示します。ただし、情報を解釈して、ユーザーにエラーからの回復を試みるか、エラーを自分で修正するように依頼する場合もあります。
NSErrorオブジェクトは次のもので構成されます-
Domain −エラードメインは、事前定義されたNSErrorドメインのいずれかであるか、カスタムドメインを説明する任意の文字列であり、ドメインはnilであってはなりません。
Code −エラーのエラーコード。
User Info −エラーおよび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