目录

Objective-C - 错误处理(C - Error Handling)

在Objective-C编程中,错误处理由Foundation framework.提供的NSError类提供Foundation framework.

与仅使用错误代码或错误字符串相比,NSError对象封装了更丰富且更具可扩展性的错误信息。 NSError对象的核心属性是错误域(由字符串表示),特定于域的错误代码和包含应用程序特定信息的用户信息字典。

NSError

Objective-C程序使用NSError对象来传达有关用户需要了解的运行时错误的信息。 在大多数情况下,程序会在对话框或工作表中显示此错误信息。 但它也可能会解释信息并要求用户尝试从错误中恢复或尝试自行更正错误

NSError对象包括 -

  • Domain - 错误域可以是预定义的NSError域之一,也可以是描述自定义域和域的任意字符串,不能为nil。

  • Code - 错误的错误代码。

  • User Info - 错误和userInfo的userInfo字典可能为零。

以下示例显示如何创建自定义错误

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
↑回到顶部↑
WIKI教程 @2018