Sto lavorando sul porting di una base di codice Java per Cocoa/Objective-C per l'uso su scrivania codice di Mac OS X. Il Java è sacco e sacco dei metodi con eccezioni controllate come:Quando si esegue il porting del codice Java su ObjC, qual è il modo migliore per rappresentare le eccezioni controllate?
double asNumber() throws FooException {
...
}
cos'è il modo migliore per rappresentarli in Objective-C? Eccezioni o parametri di errore?
- (CGFloat)asNumber {
... // possibly [FooException raise:format:];
}
o
- (CGFloat)asNumberError:(NSError **)outError {
...
}
ho la sensazione che fuori-errori sono in genere la soluzione migliore per Objective-C, ma come si può vedere ... un sacco di metodi come quello di cui sopra sarà essere piuttosto goffo. E ancora, ci sono lotti di questi.
Naturalmente tenere a mente che poiché questi sono controllati eccezioni in Java, ho bisogno di aggiungere sia @try
blocchi o if (*outError) {...}
controlli ovunque questi metodi vengono chiamati (sacco dei posti).
Ricordo che durante l'immissione dei blocchi @try
era una volta costoso in Objective-C, è economico in 64-bit o SL o qualche altro nuovo env (non ricordo esattamente). Non sono affatto preoccupato per la compatibilità all'indietro, quindi sono sicuramente disposto a progettare solo per il nuovo hotness.
per quelli che seguono a casa, ho deciso di andare con errori esterni e seguire consigli di NSScanner di Quinn. quindi questo particolare metodo sarebbe qualcosa di simile: '- (BOOL) getNumber: (CGFloat *) errore outNum: (NSError **) outErr;' –
@olliej indica correttamente che i blocchi @try sono "a costo zero" nel runtime moderno (64-bit e iPhone), ma le eccezioni costano ancora quando le butti. Inoltre, se lo desideri, puoi usare 'double' al posto di' CGFloat'. Vai con qualunque sia la migliore pratica per l'ambiente in cui ti trovi e il codice con cui ti integrerai. –