Objective-C-Fehlerbehandlung
In der Objective-C-Programmierung wird die Fehlerbehandlung mit der in verfügbaren NSError-Klasse bereitgestellt Foundation framework.
Ein NSError-Objekt kapselt umfangreichere und erweiterbarere Fehlerinformationen, als dies nur mit einem Fehlercode oder einer Fehlerzeichenfolge möglich ist. Die Kernattribute eines NSError-Objekts sind eine Fehlerdomäne (dargestellt durch eine Zeichenfolge), ein domänenspezifischer Fehlercode und ein Benutzerinformationswörterbuch mit anwendungsspezifischen Informationen.
NSError
Objective-C-Programme verwenden NSError-Objekte, um Informationen zu Laufzeitfehlern zu übermitteln, über die Benutzer informiert werden müssen. In den meisten Fällen zeigt ein Programm diese Fehlerinformationen in einem Dialogfeld oder Blatt an. Es kann aber auch die Informationen interpretieren und den Benutzer entweder auffordern, zu versuchen, den Fehler zu beheben, oder versuchen, den Fehler selbst zu beheben
NSError-Objekt besteht aus -
Domain - Die Fehlerdomäne kann eine der vordefinierten NSError-Domänen sein oder eine beliebige Zeichenfolge, die eine benutzerdefinierte Domäne beschreibt, und die Domäne darf nicht Null sein.
Code - Der Fehlercode für den Fehler.
User Info - Das userInfo-Wörterbuch für den Fehler und userInfo kann null sein.
Das folgende Beispiel zeigt, wie Sie einen benutzerdefinierten Fehler erstellen
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];
Hier ist der vollständige Code des obigen Fehlerbeispiels, der als Referenz auf einen Zeiger übergeben wurde -
#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;
}
Im obigen Beispiel geben wir einen Namen zurück, wenn die ID 1 ist, andernfalls setzen wir das benutzerdefinierte Fehlerobjekt.
Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:
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