Objective-C 错误处理
在Objective-C编程,错误处理提供由Foundation框架的 NSError类。
一个的NSError对象封装更加丰富和扩展的错误信息,可能比只使用一个错误代码或错误字符串。 NSError对象的核心属性是一个错误域(由一个字符串表示),域特定的错误代码和用户信息字典,包含应用程序的具体信息。
NSError
Objective-C程序使用NSError对象运行时错误,用户需要了解的信息传达。在大多数情况下,程序会显示一个对话框,这个错误信息或片状。但它也可能解释的信息,或者询问用户来尝试恢复错误或尝试纠正该错误在其自己
NSError对象包括:
-
域名:错误域可以是一个预定义的的NSError域或任意字符串描述一个自定义域和域必须为nil。
-
代码:错误的错误代码。
-
用户信息:用户信息字典错误和 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