Programowanie w rzutkach - wyjątki

Wyjątek (lub wyjątkowe zdarzenie) to problem, który pojawia się podczas wykonywania programu. Gdy wystąpi wyjątek, normalny przepływ programu zostaje zakłócony, a program / aplikacja kończy się nieprawidłowo.

Wbudowane wyjątki Dart obejmują -

Sr.No Wyjątki i opis
1

DeferredLoadException

Zgłaszane, gdy odroczona biblioteka nie ładuje się.

2

FormatException

Wyjątek zgłoszony, gdy ciąg lub inne dane nie mają oczekiwanego formatu i nie można ich przeanalizować ani przetworzyć.

3

IntegerDivisionByZeroException

Wyrzucane, gdy liczba jest podzielona przez zero.

4

IOException

Klasa bazowa dla wszystkich wyjątków związanych z wyjściem Inupt.

5

IsolateSpawnException

Zgłaszane, gdy nie można utworzyć izolatu.

6

Timeout

Zgłaszane, gdy nastąpi zaplanowany limit czasu podczas oczekiwania na wynik asynchroniczny.

Każdy wyjątek w Dart jest podtypem wcześniej zdefiniowanej klasy Exception. Wyjątki muszą być obsługiwane, aby zapobiec nagłemu zamknięciu aplikacji.

Bloki try / on / catch

Plik tryblok osadza kod, który może spowodować wyjątek. Blok włączania jest używany, gdy należy określić typ wyjątku. Plikcatch blok jest używany, gdy program obsługi potrzebuje obiektu wyjątku.

Plik try po bloku musi następować dokładnie jeden on / catch blok lub jeden finallyblok (lub jeden z obu). Gdy wyjątek wystąpi w bloku try, formant jest przenoszony docatch.

Plik syntax do obsługi wyjątku podano poniżej -

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

Oto kilka punktów, o których należy pamiętać -

  • Fragment kodu może mieć więcej niż jeden blok on / catch do obsługi wielu wyjątków.

  • Blok on i blok catch wzajemnie się wykluczają, tj. Blok try może być powiązany zarówno z blokiem on, jak i blokiem catch.

Poniższy kod ilustruje obsługę wyjątków w Dart -

Przykład: Korzystanie z bloku ON

Poniższy program dzieli dwie liczby reprezentowane przez zmienne x i yodpowiednio. Kod zgłasza wyjątek, ponieważ próbuje podzielić przez zero. Plikon block zawiera kod do obsługi tego wyjątku.

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

Powinien dać następujący wynik output -

Cannot divide by zero

Przykład: użycie bloku catch

W poniższym przykładzie użyliśmy tego samego kodu, co powyżej. Jedyną różnicą jest to, żecatch block(zamiast bloku ON) tutaj zawiera kod do obsługi wyjątku. Parametrcatch zawiera obiekt wyjątku zgłoszony w czasie wykonywania.

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

Powinien dać następujący wynik output -

IntegerDivisionByZeroException

Przykład: na… haczyku

Poniższy przykład pokazuje, jak używać on...catch blok.

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

Powinien dać następujący wynik output -

IntegerDivisionByZeroException

Ostatni blok

Plik finallyblok zawiera kod, który powinien zostać wykonany niezależnie od wystąpienia wyjątku. Opcjonalnyfinally blok jest wykonywany bezwarunkowo po try/on/catch.

Składnia używania finally blok jest następujący -

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 
}

Poniższy przykład ilustruje użycie finally blok.

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'); 
   } 
}

Powinien dać następujący wynik output -

Cannot divide by zero 
Finally block executed

Zgłaszanie wyjątku

Plik throwsłowo kluczowe służy do jawnego zgłaszania wyjątku. Należy obsłużyć podniesiony wyjątek, aby zapobiec nagłemu zamknięciu programu.

Plik syntax jawne zgłaszanie wyjątku to -

throw new Exception_name()

Przykład

Poniższy przykład pokazuje, jak używać throw słowo kluczowe, aby zgłosić wyjątek -

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

Powinien dać następujący wynik output -

Age cannot be negative

Wyjątki niestandardowe

Jak określono powyżej, każdy typ wyjątku w Dart jest podtypem klasy wbudowanej Exception. Dart umożliwia tworzenie niestandardowych wyjątków poprzez rozszerzenie istniejących. Składnia definiowania niestandardowego wyjątku jest następująca:

Składnia: definiowanie wyjątku

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

Wyjątki niestandardowe powinny być zgłaszane jawnie i to samo powinno być obsługiwane w kodzie.

Przykład

Poniższy przykład pokazuje, jak zdefiniować i obsługiwać niestandardowy wyjątek.

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(); 
   } 
}

W powyższym kodzie definiujemy wyjątek niestandardowy, AmtException. Kod zgłasza wyjątek, jeśli przekazana kwota nie mieści się w zakresie objętym wyjątkiem. Plikmain funkcja zawiera wywołanie funkcji w try...catch blok.

Kod powinien dawać następujące efekty output -

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