การจัดการข้อผิดพลาด Objective-C

ในการเขียนโปรแกรม Objective-C การจัดการข้อผิดพลาดมีให้กับคลาส NSError ที่มีอยู่ใน Foundation framework.

อ็อบเจ็กต์ NSError จะห่อหุ้มข้อมูลข้อผิดพลาดที่สมบูรณ์และขยายได้มากกว่าที่เป็นไปได้โดยใช้รหัสข้อผิดพลาดหรือสตริงข้อผิดพลาดเท่านั้น แอ็ตทริบิวต์หลักของอ็อบเจ็กต์ NSError คือโดเมนข้อผิดพลาด (แสดงโดยสตริง) รหัสข้อผิดพลาดเฉพาะโดเมนและพจนานุกรมข้อมูลผู้ใช้ที่มีข้อมูลเฉพาะแอปพลิเคชัน

NSError

โปรแกรม Objective-C ใช้อ็อบเจ็กต์ NSError เพื่อถ่ายทอดข้อมูลเกี่ยวกับข้อผิดพลาดรันไทม์ที่ผู้ใช้ต้องได้รับแจ้ง ในกรณีส่วนใหญ่โปรแกรมจะแสดงข้อมูลข้อผิดพลาดนี้ในกล่องโต้ตอบหรือแผ่นงาน แต่อาจตีความข้อมูลและขอให้ผู้ใช้พยายามกู้คืนจากข้อผิดพลาดหรือพยายามแก้ไขข้อผิดพลาดด้วยตัวเอง

NSError Object ประกอบด้วย -

  • Domain - โดเมนข้อผิดพลาดสามารถเป็นหนึ่งในโดเมน NSError ที่กำหนดไว้ล่วงหน้าหรือสตริงที่กำหนดเองซึ่งอธิบายโดเมนที่กำหนดเองและโดเมนต้องไม่เป็นศูนย์

  • 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