Programmazione Dart - Eccezioni

Un'eccezione (o evento eccezionale) è un problema che sorge durante l'esecuzione di un programma. Quando si verifica un'eccezione, il normale flusso del programma viene interrotto e il programma / applicazione termina in modo anomalo.

Le eccezioni Dart incorporate includono:

Suor n Eccezioni e descrizione
1

DeferredLoadException

Generato quando una libreria differita non viene caricata.

2

FormatException

Eccezione generata quando una stringa o altri dati non hanno un formato previsto e non possono essere analizzati o elaborati.

3

IntegerDivisionByZeroException

Lanciato quando un numero viene diviso per zero.

4

IOException

Classe base per tutte le eccezioni relative a Inupt-Output.

5

IsolateSpawnException

Lanciato quando non è possibile creare un isolato.

6

Timeout

Generato quando si verifica un timeout pianificato durante l'attesa di un risultato asincrono.

Ogni eccezione in Dart è un sottotipo della classe predefinita Exception. Le eccezioni devono essere gestite per impedire la chiusura improvvisa dell'applicazione.

I blocchi try / on / catch

Il tryblock incorpora codice che potrebbe causare un'eccezione. Il blocco on viene utilizzato quando è necessario specificare il tipo di eccezione. Ilcatch block viene utilizzato quando il gestore necessita dell'oggetto eccezione.

Il try blocco deve essere seguito esattamente da uno on / catch blocco o uno finallyblocco (o uno di entrambi). Quando si verifica un'eccezione nel blocco try, il controllo viene trasferito al filecatch.

Il syntax per la gestione di un'eccezione è come indicato di seguito:

try { 
   // code that might throw an exception 
}  
on Exception1 { 
   // code for handling exception 
}  
catch Exception2 { 
   // code for handling exception 
}

Di seguito sono riportati alcuni punti da ricordare:

  • Uno snippet di codice può avere più di un blocco on / catch per gestire più eccezioni.

  • Il blocco on e il blocco catch si includono reciprocamente, ovvero un blocco try può essere associato sia al blocco on che al blocco catch.

Il codice seguente illustra la gestione delle eccezioni in Dart -

Esempio: utilizzo del blocco ON

Il seguente programma divide due numeri rappresentati dalle variabili x e yrispettivamente. Il codice genera un'eccezione poiché tenta la divisione per zero. Ilon block contiene il codice per gestire questa eccezione.

main() { 
   int x = 12; 
   int y = 0; 
   int res;  
   
   try {
      res = x ~/ y; 
   } 
   on IntegerDivisionByZeroException { 
      print('Cannot divide by zero'); 
   } 
}

Dovrebbe produrre quanto segue output -

Cannot divide by zero

Esempio: utilizzo del blocco catch

Nell'esempio seguente, abbiamo utilizzato lo stesso codice di cui sopra. L'unica differenza è che il filecatch block(invece del blocco ON) qui contiene il codice per gestire l'eccezione. Il parametro dicatch contiene l'oggetto eccezione generato in fase di esecuzione.

main() { 
   int x = 12; 
   int y = 0; 
   int res;  
   
   try {  
      res = x ~/ y; 
   }  
   catch(e) { 
      print(e); 
   } 
}

Dovrebbe produrre quanto segue output -

IntegerDivisionByZeroException

Esempio: su ... cattura

L'esempio seguente mostra come utilizzare l'estensione on...catch bloccare.

main() { 
   int x = 12; 
   int y = 0; 
   int res;  
   
   try { 
      res = x ~/ y; 
   }  
   on IntegerDivisionByZeroException catch(e) { 
      print(e); 
   } 
}

Dovrebbe produrre quanto segue output -

IntegerDivisionByZeroException

L'ultimo blocco

Il finallyblock include codice che dovrebbe essere eseguito indipendentemente dal verificarsi di un'eccezione. L'opzionalefinally block viene eseguito incondizionatamente dopo try/on/catch.

La sintassi per l'utilizzo di finally il blocco è il seguente -

try { 
   // code that might throw an exception 
}  
on Exception1 { 
   // exception handling code 
}  
catch Exception2 { 
   //  exception handling 
}  
finally { 
   // code that should always execute; irrespective of the exception 
}

L'esempio seguente illustra l'uso di finally bloccare.

main() { 
   int x = 12; 
   int y = 0; 
   int res;  
   
   try { 
      res = x ~/ y; 
   } 
   on IntegerDivisionByZeroException { 
      print('Cannot divide by zero'); 
   } 
   finally { 
      print('Finally block executed'); 
   } 
}

Dovrebbe produrre quanto segue output -

Cannot divide by zero 
Finally block executed

Lanciare un'eccezione

Il throwla parola chiave viene utilizzata per sollevare esplicitamente un'eccezione. Un'eccezione sollevata dovrebbe essere gestita per impedire la chiusura improvvisa del programma.

Il syntax per sollevare un'eccezione esplicitamente è -

throw new Exception_name()

Esempio

L'esempio seguente mostra come utilizzare l'estensione throw parola chiave per generare un'eccezione -

main() { 
   try { 
      test_age(-2); 
   } 
   catch(e) { 
      print('Age cannot be negative'); 
   } 
}  
void test_age(int age) { 
   if(age<0) { 
      throw new FormatException(); 
   } 
}

Dovrebbe produrre quanto segue output -

Age cannot be negative

Eccezioni personalizzate

Come specificato sopra, ogni tipo di eccezione in Dart è un sottotipo della classe incorporata Exception. Dart consente di creare eccezioni personalizzate estendendo quelle esistenti. La sintassi per definire un'eccezione personalizzata è la seguente:

Sintassi: definizione dell'eccezione

class Custom_exception_Name implements Exception { 
   // can contain constructors, variables and methods 
}

Le eccezioni personalizzate dovrebbero essere sollevate in modo esplicito e le stesse dovrebbero essere gestite nel codice.

Esempio

L'esempio seguente mostra come definire e gestire un'eccezione personalizzata.

class AmtException implements Exception { 
   String errMsg() => 'Amount should be greater than zero'; 
}  
void main() { 
   try { 
      withdraw_amt(-1); 
   } 
   catch(e) { 
      print(e.errMsg()); 
   }  
   finally { 
      print('Ending requested operation.....'); 
   } 
}  
void withdraw_amt(int amt) { 
   if (amt <= 0) { 
      throw new AmtException(); 
   } 
}

Nel codice sopra, stiamo definendo un'eccezione personalizzata, AmtException. Il codice solleva l'eccezione se l'importo passato non rientra nell'intervallo escluso. Ilmain funzione racchiude la chiamata della funzione nel file try...catch bloccare.

Il codice dovrebbe produrre quanto segue output -

Amount should be greater than zero 
Ending requested operation....