Inici de sessió d'usuari


Capturant Excepcions


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];
}

Llençant Excepcions

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.

Processant Excepcions

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:

  1. Captura el tipus d'excepció més específica.
  2. Captura un tipus d'excepció més general.
  3. Re-llença la excepció capturada

    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.

  4. Executa qualsevol procediment de neteja que sempre s'ha d'executar, tant si s'executen les excepcions com no.