Se si dispone di una notevole quantità di errori nella costruzione, la tua vita potrebbe essere molto più semplice utilizzando una classe. Io in realtà uso C++ per questo quindi le chiamate di un programma non ha bisogno può essere rimosso (a differenza objc), ma è possibile utilizzare C, objC, o C++ per questo:
MONErrorDomain.h
// you won't normally need an instance here
@interface MONErrorDomain : NSObject
+ (NSString *)domain; // << required override
- (NSString *)domain; // << returns [[self class] domain]
// example convenience methods:
// uses [self domain]
+ (NSError *)errorWithErrorCode:(NSInteger)errorCode; // << user info would be nil
+ (NSError *)errorWithErrorCode:(NSInteger)errorCode userInfo:(NSDictionary *)userInfo;
@end
MONKoalaError.h
@interface MONKoalaError : MONErrorDomain
+ (NSError *)outOfEucalyptus;
@end
extern NSString * const MONKoalaErrorDomain;
typedef enum MONKoalaErrorCode {
MONKoalaErrorCode_Undefined = 0,
MONKoalaErrorCode_OutOfEucalyptus
} MONKoalaErrorCode;
MONKoalaError.m
// apple recommends we use reverse domains
NSString * const MONKoalaErrorDomain = @"com.mon.koala-library.MONKoalaErrorDomain";
@implementation MONKoalaError
+ (NSString *)domain
{
return MONKoalaErrorDomain;
}
+ (NSError *)outOfEucalyptus
{
NSDictionary * info = …;
return [self errorWithErrorCode:MONKoalaErrorCode_OutOfEucalyptus userInfo:info];
}
@end
Poi la creazione di errore è tutto in un unico luogo per ogni dominio, ed i clienti possono facilmente raccogliere i loro errori senza peraltro riuscire a costruire manualmente:
if (outError) {
*outError = [MONKoalaError outOfEucalyptus];
}
e la gestione degli errori assume la forma:
if ([e.domain isEqualToString:MONKoalaErrorDomain]) {
switch (e.code) {
case MONKoalaErrorCode_OutOfEucalyptus : {
self.needsEucalyptus = true;
…
Solo un piccolo commento: mentre un codice di errore NSError non dovrebbe essere confuso dal codice di uscita del programma, trovo contro intuitivo avere un codice di errore uguale a 0. Preferisco avere -1 per un errore indefinito. – Alerty
@Alerty '0' viene utilizzato per undefined perché è un valore più prevedibile quando un programmatore introduce un errore logico (ad esempio, messaggi' nil' o utilizza la memoria inizializzata predefinita in debug). vale a dire, l'errore non dovrebbe mai restituire "MONKoalaErrorCode_Undefined" se si tratta di un errore di "MONKoalaErrorCode". – justin