Objective-C錯誤處理


在Objective-C程式設計中,錯誤處理由Foundation框架中提供的NSError類提供處理。

與僅使用錯誤程式碼或錯誤字串相比,NSError物件封裝了更豐富且更具可延伸性的錯誤資訊。 NSError物件的核心屬性是錯誤域(由字串表示),特定於域的錯誤程式碼和包含應用程式特定資訊的使用者資訊字典。

NSError

Objective-C程式使用NSError物件來傳達有關使用者需要了解的執行時錯誤的資訊。 在大多數情況下,程式會在對話方塊或工作表中顯示此錯誤資訊。 但它也可能會解釋資訊並要求使用者嘗試從錯誤中恢復或嘗試自行更正錯誤

NSError物件包括 -

  • - 錯誤域可以是預定義的NSError域之一,也可以是描述自定義域和域的任意字串,不能為nil
  • 程式碼 - 錯誤的錯誤程式碼。
  • 使用者資訊 - 錯誤和userInfo的字典可能為nil

以下範例程式碼顯示如何建立自定義錯誤 -

NSString *domain = @"com.yiibai.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; 
}

在上面的例子中,如果id1,則返回一個名稱,否則設定使用者定義的錯誤物件。

編譯並執行上述程式碼時,會產生以下結果 -

2018-11-15 13:53:52.027 main[136833] Name1: Employee Test Name
2018-11-15 13:53:52.029 main[136833] Error finding Name2: Unable to complete the process