Objective-C 错误处理

  • 错误处理

    在Objective-C编程中,错误处理是由Foundation框架中提供的NSError类提供的。与仅使用错误代码或错误字符串可能实现的方式相比,NSError对象封装了更丰富,更可扩展的错误信息。NSError对象的核心属性是错误域(由字符串表示),特定于域的错误代码和包含应用程序特定信息的用户信息字典。
    NSError
    Objective-C程序使用NSError对象传达有关运行时错误的信息,需要告知用户。在大多数情况下,程序会在对话框或工作表中显示此错误信息。但是它也可能会解释该信息,并要求用户尝试从错误中恢复或尝试自行纠正错误。NSError对象包括-
    • - 错误域可以是预定义的NSError域之一,也可以是描述自定义域的任意字符串,并且域不得为nil。
    • 代码 - 错误的错误代码。
    • 用户信息 - 错误和用户信息的用户信息字典可能为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,则返回一个名称,否则设置用户定义的错误对象。编译并执行上述代码后,将产生以下结果-
    
    2020-08-08 16:51:27.071 test[11164:11796] Name1: Employee Test Name
    2020-08-08 16:51:27.077 test[11164:11796] Error finding Name2: Unable to complete the process