El llenguatge Objective-C té una sintaxi de captura d'exepcions similar a la que té Java i C++ amb l'us de les classes NSException, NSError, o de pròpies, pots afegir una robusta captura d'excepcions en els teus programes.
El suport d'excepcions giren al voltant de quatre directives del compilador: @try, @catch, @throw i @finally. El codi que potencialment pot llençar una exceptió està tancat per un block @try. Un block @finally conté el codi que ha d'executar-se si un excepció és llença o no. Utilitza la directiva @throw per llançar una excepció, que és essencialment un punter a un objecte Objective-C. Pots utilitzar els objectes NSException però no estan limitades a ells.
L'exemple de sota representa un algoritme simple de captura d'exepcions:
Cup *cup = [[Cup alloc] init];
@try {
[cup fill];
}
@catch (NSException *exception) {
NSLog(@"main: Caught %@: %@", [exception name], [exception reason]);
}
@finally {
[cup release];
}
Per llençar una excepció has d'instanciar un objecte amb la informació apropiada, com el nom de la excepció i el motiu pel que s'ha llançat.
NSException *exception = [NSException exceptionWithName:@"HotTeaException"
reason:@"The tea is too hot" userInfo:nil];
@throw exception;
Dins un block @catch(), pots rellançar la excepció capturada utilitzant la directiva @throw sense cap argument. Això pot ajudar fer el teu codi més llegible.
Pots fer una subclasse de NSException per implementar tipus especialitzats d'excepcions, com excepcions del sistema de fitxers o excepcions de comunicacions.
| Nota: No estas limitat a llençar NSExceptions. Pots llençar qualsevol objecte d'Objective-C com un objecte d'exepció. La classe NSException proporciona mètodes que et poden ajudar en el processat de les excepcions, però pots implementar la teva pròpia si ho desitjes. |
Per capturar una excepció llançada en un bloc @try, utilitza un o més blocs @catch() a continuació del block @try. Els blocs han d'estar ordenats des de mès específics a menys específics. D'aquesta forma pots adaptar el processament de les excepcions en grups, com mostra el Llistat 2-1.
Llistat 2-1 Un capturador d'excepció
try {
...
}
catch (ExceptioPersonalitzada *ce) { //1
...
}
catch (NSException *ne) { //2
// Executa el procés necessari en aquest nivell.
...
// Rellença la excepció que s'ha capturat en el nivell anterior.
@throw; //3
}
catch (id ue) {
...
}
@finally { //4
// Executa el procés necessari tant si s'ha produit una excepció com si no.
...
}
La següent llista descriu les linies numerades:
Per departamentalitzar el procediment d'excepcions, pots necessitar capturar excepcions en un programa. Així si un mètode o funció captura una excepció que no pot processar, aquest pot rellançar-la per el següent capturador d'excepcions.