2010-07-18 11 views
99

C'è un previous SO post relativo all'impostazione dei domini di errore per i propri framework, ma qual è la procedura migliore per l'impostazione dei domini di errore e dei codici di errore personalizzati per il proprio progetto/app?Best Practice - NSError domini e codici per il proprio progetto/app

Per esempio, supponendo che si sta lavorando su un'applicazione Core Data-intensive con un sacco di convalide, si dovrebbe solo bastone con i "off the shelf" Core codici di dati di errore (come ad esempio NSManagedObjectValidationError da CoreDataErrors.h) o In caso di creare i propri MyAppErrors.h e definire gli errori con più specificità (ad esempio, MyAppValidationErrorInvalidCombinationOfLimbs?

Creazione di un dominio di errore personalizzato e una serie di codici di errore potrebbe disambiguare in modo significativo il proprio codice, ma è troppo in alto per mantenere e si fa devono preoccuparsi di errore conflitti di numerazione del codice? O ci sono altri problemi qui?

risposta

141

Io personalmente uso un rever dominio di stile se-DNS. Per esempio:

NSError * myInternalError = [NSError errorWithDomain:@"com.davedelong.myproject" code:42 userInfo:someUserInfo]; 

La terza parte del dominio (@"myproject") è solo utilizzato per differenziare gli errori di questo progetto ("My Project") da errori in un altro progetto ("My Other Project" =>com.davedelong.myotherproject).

E 'un modo semplice per assicurare che io non ho intenzione di entrare in conflitto con i domini di errore di chiunque altro (se sto utilizzando il codice 3a parte), a meno che lo sviluppatore è volutamente cercando di pasticciare con solo io (che ho credo sarebbe altamente improbabile ...).

Per quanto riguarda i conflitti di numerazione del codice, non preoccuparti. Basta che i codici siano univoci all'interno di un dominio, dovresti essere OK.

Per quanto riguarda la traduzione degli errori, dipende da voi. Qualunque cosa tu faccia, assicurati di documentarla bene. Personalmente, di solito trasmetto gli errori generati dal framework non appena sono arrivati ​​da me, poiché non sono mai abbastanza sicuro che gestirò tutti i codici e tradurrò tutte le informazioni utente in qualcosa di più specifico del mio progetto. I framework potrebbero cambiare e aggiungere più codici, o cambiare il significato dei codici esistenti, ecc. Inoltre mi aiuta a identificare in modo specifico da dove proviene l'errore. Ad esempio, se il mio framework StackKit genera un errore nel dominio com.stackkit, so che si tratta di un problema di framework. Tuttavia, se genera un errore nello , allora so che proviene specificamente dal meccanismo di caricamento degli URL.

Quello che poteva fare è catturare l'errore quadro generato e avvolgerlo in un nuovo oggetto errore che ha il vostro dominio e un codice generico, qualcosa come kFrameworkErrorCodeUnknown o qualcosa del genere, e quindi posizionare l'errore catturato nel userInfo sotto la NSUnderlyingErrorKey. CoreData fa molto (ad esempio, se provi a save: un NSManagedObjectContext, ma hai errori di integrità della relazione, riceverai un unico errore, ma lo NSUnderlyingErrorKey conterrà molte più informazioni, come nello specifico quali relazioni sono sbagliate, ecc.).

+0

Poiché Apple utilizza anche il DNS inverso, sembra appropriato che anche altri utilizzino questo stile. –

+0

Il collegamento al framework StackKit (stackkit.com) è guasto. – Pang

28

Non ho abbastanza rep per commentare, ma per la risposta accettata da Dave DeLong, potrebbe essere leggermente migliore usare [[NSBundle mainBundle] bundleIdentifier] anziché @"com.myName.myProject". In questo modo, se cambi il tuo nome o il nome del progetto, verrà riflesso in modo accurato.

+4

Buona idea. Se stai usando Swift, dovresti utilizzare l'opzione facoltativa non confezionata: 'NSBundle.mainBundle(). BundleIdentifier!' (Se sai che l'identificatore del bundle è impostato, che suppongo sia più probabile) – Juul

+0

Perché dovresti voler riflettere il progetto cambia nome nel dominio degli errori? – zrxq

+1

@zrxq C'è un certo valore nell'avere diversi domini di errore, ma immagina di aver sbagliato a scrivere il tuo progetto o hai cambiato il tuo nome e lo hai voluto che riflettesse ovunque. Meglio farlo dinamicamente impostato rispetto a un codice hard. – Connor