Obsługa błędów Objective-C
W programowaniu Objective-C obsługę błędów zapewnia klasa NSError dostępna w Foundation framework.
Obiekt NSError hermetyzuje bogatsze i bardziej rozszerzalne informacje o błędach, niż jest to możliwe przy użyciu tylko kodu błędu lub ciągu błędu. Podstawowe atrybuty obiektu NSError to domena błędów (reprezentowana przez ciąg znaków), kod błędu właściwy dla domeny oraz słownik informacji o użytkowniku zawierający informacje specyficzne dla aplikacji.
NSError
Programy Objective-C używają obiektów NSError do przekazywania informacji o błędach w czasie wykonywania, o których użytkownicy muszą być informowani. W większości przypadków program wyświetla te informacje o błędzie w oknie dialogowym lub arkuszu. Ale może również zinterpretować informacje i poprosić użytkownika o próbę naprawy błędu lub próbę samodzielnego naprawienia błędu
Obiekt NSError składa się z -
Domain - Domena błędów może być jedną z predefiniowanych domen NSError lub dowolnym ciągiem opisującym domenę niestandardową, a domena nie może być zerowa.
Code - Kod błędu dotyczący błędu.
User Info - Słownik informacji o użytkowniku dla błędu i informacje o użytkowniku może być zerowy.
Poniższy przykład pokazuje, jak utworzyć niestandardowy błąd
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];
Oto pełny kod powyższego przykładu błędu przekazanego jako odniesienie do wskaźnika -
#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;
}
W powyższym przykładzie zwracamy nazwę, jeśli id wynosi 1, w przeciwnym razie ustawiamy obiekt błędu zdefiniowanego przez użytkownika.
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
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