Objective-C 错误处理

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

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


NSError

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

NSError 对象包括:

  • Domain − error 域可以是预定义的 NSError 域之一,也可以是描述自定义域的任意字符串,并且域不能为零。
  • Code − 错误的错误码
  • User Info − 错误和用户信息的用户信息字典可能为零。

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

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

下面是作为指针引用传递的上述错误实例的完整代码:

  1. #import <Foundation/Foundation.h>
  2. @interface SampleClass:NSObject
  3. -(NSString *) getEmployeeNameForID:(int) id withError:(NSError **)errorPtr;
  4. @end
  5. @implementation SampleClass
  6. -(NSString *) getEmployeeNameForID:(int) id withError:(NSError **)errorPtr {
  7. if(id == 1) {
  8. return @"Employee Test Name";
  9. } else {
  10. NSString *domain = @"com.MyCompany.MyApplication.ErrorDomain";
  11. NSString *desc =@"Unable to complete the process";
  12. NSDictionary *userInfo = [[NSDictionary alloc]
  13. initWithObjectsAndKeys:desc,
  14. @"NSLocalizedDescriptionKey",NULL];
  15. *errorPtr = [NSError errorWithDomain:domain code:-101
  16. userInfo:userInfo];
  17. return @"";
  18. }
  19. }
  20. @end
  21. int main() {
  22. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  23. SampleClass *sampleClass = [[SampleClass alloc]init];
  24. NSError *error = nil;
  25. NSString *name1 = [sampleClass getEmployeeNameForID:1 withError:&error];
  26. if(error) {
  27. NSLog(@"Error finding Name1: %@",error);
  28. } else {
  29. NSLog(@"Name1: %@",name1);
  30. }
  31. error = nil;
  32. NSString *name2 = [sampleClass getEmployeeNameForID:2 withError:&error];
  33. if(error) {
  34. NSLog(@"Error finding Name2: %@",error);
  35. } else {
  36. NSLog(@"Name2: %@",name2);
  37. }
  38. [pool drain];
  39. return 0;
  40. }

在上面的实例中,如果 id 为 1,我们将返回一个名称,否则我们将设置用户定义的错误对象。

当编译和执行上述代码时,它会产生以下结果:

  1. 2022-07-07 18:01:00.809 demo[27632] Name1: Employee Test Name
  2. 2022-07-07 18:01:00.809 demo[27632] Error finding Name2: Unable to complete the process