Xử lý lỗi Objective-C
Trong lập trình Objective-C, xử lý lỗi được cung cấp với lớp NSError có sẵn trong Foundation framework.
Đối tượng NSError đóng gói thông tin lỗi phong phú hơn và có thể mở rộng hơn khả năng chỉ sử dụng mã lỗi hoặc chuỗi lỗi. Các thuộc tính cốt lõi của đối tượng NSError là miền lỗi (được biểu thị bằng một chuỗi), mã lỗi dành riêng cho miền và từ điển thông tin người dùng chứa thông tin cụ thể về ứng dụng.
NSError
Các chương trình Objective-C sử dụng các đối tượng NSError để truyền tải thông tin về các lỗi thời gian chạy mà người dùng cần được thông báo. Trong hầu hết các trường hợp, một chương trình hiển thị thông tin lỗi này trong hộp thoại hoặc trang tính. Nhưng nó cũng có thể giải thích thông tin và yêu cầu người dùng cố gắng khôi phục lỗi hoặc cố gắng tự sửa lỗi
Đối tượng NSError bao gồm -
Domain - Miền lỗi có thể là một trong các miền NSError được xác định trước hoặc một chuỗi tùy ý mô tả miền tùy chỉnh và miền không được bằng 0.
Code - Mã lỗi cho lỗi.
User Info - Từ điển userInfo cho lỗi và userInfo có thể là 0.
Ví dụ sau cho thấy cách tạo lỗi tùy chỉnh
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];
Đây là mã hoàn chỉnh của mẫu lỗi ở trên được chuyển làm tham chiếu đến một con trỏ -
#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;
}
Trong ví dụ trên, chúng tôi trả về một tên nếu id là 1, nếu không, chúng tôi đặt đối tượng lỗi do người dùng xác định.
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
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