martedì 4 maggio 2010

Guida Objective-C in Italiano - Le Eccezioni - Parte 12


Siamo giunti alla dodicesima parte della Guida in Italiano alla programmazione in Objective-C, oggi parleremo della Gestione delle Eccezioni. Vi ricordo che potrete trovare tutti i links agli articoli di questa guida nella barra laterale del sito.

Questo post è una traduzione in italiano della Guida all'Objective C, presente sul sito developer.apple.com a questo link. L'Objective C è il linguaggio di programmazione per creare applicazioni per iPhone. Questo articolo può interessare a tutti gli sviluppatori che vogliono imparare le basi di questo linguaggio che è il fondamento per programmare nuove applicazioni per Mac Os X, iPhone ed iPad.



Gestione delle Eccezioni

Il linguaggio Objective-C ha una sintassi per la gestione delle eccezioni simile a quella dei linguaggi Java and C++. Accoppiata con l'uso di NSException, NSError, o classi personalizzate, puoi aggiungere una robusta gestione degli errori per i tuoi programmi. Questo articolo fornisce un sommario della sintassi delle eccezioni e la loro gestione.

Abilitare la gestione delle Eccezioni

Usando gcc versione 3.3 e successive, Objective-C fornisce un supporto per la gestione delle eccezioni. Per attivare il supporto per queste caratteristiche usa l'interruttore -fobjc-exceptions del GNU Compiler Collection (GCC) versione 3.3 e successivo. (Nota che questo rende l'applicazione eseguibile solo su Mac OS X v10.3 e successivi poiché il supporto di runtime per la gestione delle eccezioni e la sincronizzazione non è presente in versioni precedenti del software).

Gestione Eccezioni

Un'eccezione è una condizione speciale che interrompe il normale flusso d'esecuzione del programma. Ci sono una varietà di motivi per cui un'eccezione potrebbe essere generata dall'hardware così come dal software. Esempi includono errori aritmetici come divisioni per zero, uderflow o overflow, chiamate a istruzioni indefinite, e tentare di accedere ad una collezione di elementi fuori dai suoi limiti.

Il supporto delle eccezioni Objective-C gira attorno a quattro direttive di compilazione: @try, @catch, @throw, e @finally:
  • Il codice che può lanciare potenzialmente un'eccezione è racchiuso in un blocco @try.
  • Un blocco @catch() contiene la gestione logica delle eccezioni per le eccezioni lanciate in un blocco @try. Puoi avere blocchi @catch() multipli per catturare diversi tipi di eccezioni.
  • Un blocco @finally contiene codice che deve essere eseguito se un'eccezione è o non è lanciata.
  • Usi la direttiva @throw per lanciare un'eccezione, che è essenzialmente un'oggetto Objective-C. Tipicamente usi un'oggetto NSException, ma non è richiesto.
L'esempio sotto descrive un semplice algoritmo di gestione delle eccezioni:
Cup *cup = [[Cup alloc] init];

@try {
     [cup fill];
}

 @catch (NSException *exception) {
      NSLog(@"main: Caught %@: %@", [exception name], [exception reason]);
 }

 @finally {
      [cup release];
 }

Catturare Tipi Diversi di Eccezioni

Per catturare un'eccezione lanciata in un blocco @try, usa uno o più blocchi @catch() subito dopo il blocco @try. I blocchi @catch() dovrebbero essere ordinati dal più specifico al meno specifico. In questo modo potete adattare il processo di eccezioni come gruppi, come mostrato nel listato 11-1.

Listato 11-1 Un gestore di eccezioni
@try {
      ...
 }

@catch (CustomException *ce) { // 1
      ...
 }

@catch (NSException *ne) { // 2
      // si eseguono le elaborazioni necessarie a questo livello.
      ...
 }

@catch (id ue) {
      ...
 }

@finally { // 3
      // si eseguono le elaborazini necessarie se è occorsa o meno un'eccezione
      ...
}

La lista seguente descrive le linee di codice numerate:
  1. Cattura il tipo di eccezione più specifica.
  2. Cattura un tipo di eccezione più generico.
  3. Esegue ogni elaborazione che deve essere eseguita se un'eccezione è lanciata o meno.

Lanciare Eccezioni

Per lanciare un'eccezione devi istanziare un oggetto con l'informazione appropriata, come il nome dell'eccezione e il motivo per cui è stata lanciata.
NSException *exception = [NSException exceptionWithName:@"HotTeaException"
     reason:@"The tea is too hot" userInfo:nil];

@throw exception;
Importante: In molti ambienti, usare eccezioni è ragionevolmente ordinario. Ad esempio, potresti lanciare un'eccezione per segnalare che una routine potrebbe non eseguirsi normalmente - come quando un file manca o i dati non possono essere analizzati correttamente. Le eccezioni consumano intensivamente risorse in Objective-C. Non dovresti usare eccezioni per controlli generali del flusso, o semplicemente per significare errori. Invece dovresti usare i valori di ritorno di un metodo o di una funzione per indicare che è occorso un errore, e fornire informazioni riguardo il problema in un oggetto errore.

In un blocco @catch(), puoi re-lanciare l'eccezione catturata usando la direttiva @throw senza un argomento. Questo può aiutare a rendere il codice più leggibile.

Non sei limitato a lanciare oggetti NSException. Puoi lanciare qualsiasi oggetto Objective-C come un oggetto eccezione. La classe NSException fornisce i metodi che aiutano l'elaborazione dell'eccezione, ma puoi implementare la tua propria classe se vuoi. Puoi anche creare una sottoclasse di NSEdception per implementare tipi di eccezioni, come le eccezioni di file system o eccezioni di comunicazione.

Fine Parte 12

Finisce qui il dodicesimo articolo di questa Guida dedicato alla gestione delle eccezioni nel linguaggio di programmazione Objective-C. Il prossimo post di questa guida, parlerà brevemente del Threading. 

Segnalatemi eventuali errori, e commentate l'articolo se l'avete trovato utile, anche per incentivarmi a continuare a pubblicare le mie traduzioni. Iscrivetevi ai feed del blog per essere sempre aggiornati automaticamente ogni volta che sono disponibili nuovi contenuti. Nella barra laterale del blog potete trovare l'elenco di tutti gli articoli di questa guida.

Nessun commento:

Posta un commento

Related Posts with Thumbnails