Программирование дротиков - исключения

Исключение (или исключительное событие) - это проблема, возникающая во время выполнения программы. Когда возникает исключение, нормальный поток программы прерывается, и программа / приложение завершается ненормально.

Встроенные исключения Dart включают:

Старший Нет Исключения и описание
1

DeferredLoadException

Вызывается, когда не загружается отложенная библиотека.

2

FormatException

Исключение возникает, когда строка или некоторые другие данные не имеют ожидаемого формата и не могут быть проанализированы или обработаны.

3

IntegerDivisionByZeroException

Выбрасывается, когда число делится на ноль.

4

IOException

Базовый класс для всех исключений, связанных с Inupt-Output.

5

IsolateSpawnException

Выбрасывается, когда невозможно создать изолятор.

6

Timeout

Вызывается, когда истекает запланированный тайм-аут при ожидании результата асинхронности.

Каждое исключение в Dart - это подтип предопределенного класса Exception. Чтобы предотвратить внезапное завершение работы приложения, необходимо обрабатывать исключения.

Блоки try / on / catch

В tryblock встраивает код, который может привести к исключению. Блок on используется, когда необходимо указать тип исключения. Вcatch блок используется, когда обработчику нужен объект исключения.

В try за блоком должен следовать ровно один on / catch блок или один finallyблок (или один из обоих). Когда в блоке try возникает исключение, управление передается вcatch.

В syntax для обработки исключения, как указано ниже -

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

Ниже приведены некоторые моменты, которые следует запомнить:

  • Фрагмент кода может иметь более одного блока on / catch для обработки нескольких исключений.

  • Блок включения и блок catch взаимно включаются, т. Е. Блок try может быть связан как с блоком включения, так и блоком catch.

Следующий код иллюстрирует обработку исключений в Dart -

Пример: использование блока ON

Следующая программа делит два числа, представленных переменными x и yсоответственно. Код вызывает исключение, поскольку пытается делить на ноль. Вon block содержит код для обработки этого исключения.

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

Должно получиться следующее output -

Cannot divide by zero

Пример: использование блока catch

В следующем примере мы использовали тот же код, что и выше. Единственная разница в том, чтоcatch block(вместо блока ON) здесь содержится код для обработки исключения. Параметрcatch содержит объект исключения, созданный во время выполнения.

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

Должно получиться следующее output -

IntegerDivisionByZeroException

Пример: on… catch

В следующем примере показано, как использовать on...catch блок.

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

Должно получиться следующее output -

IntegerDivisionByZeroException

Последний блок

В finallyblock включает код, который должен выполняться независимо от возникновения исключения. Необязательныйfinally блок выполняется безоговорочно после try/on/catch.

Синтаксис для использования finally блок выглядит следующим образом -

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 
}

Следующий пример иллюстрирует использование finally блок.

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

Должно получиться следующее output -

Cannot divide by zero 
Finally block executed

Выброс исключения

В throwключевое слово используется для явного вызова исключения. Возникшее исключение следует обработать, чтобы предотвратить внезапный выход из программы.

В syntax для явного создания исключения -

throw new Exception_name()

пример

В следующем примере показано, как использовать throw ключевое слово для исключения исключения -

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

Должно получиться следующее output -

Age cannot be negative

Пользовательские исключения

Как указано выше, каждый тип исключения в Dart является подтипом встроенного класса. Exception. Dart позволяет создавать собственные исключения, расширяя существующие. Синтаксис для определения настраиваемого исключения приведен ниже -

Синтаксис: определение исключения

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

Пользовательские исключения следует вызывать явно, и то же самое следует обрабатывать в коде.

пример

В следующем примере показано, как определить и обработать настраиваемое исключение.

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

В приведенном выше коде мы определяем настраиваемое исключение, AmtException. Код вызывает исключение, если переданная сумма не находится в пределах исключенного диапазона. Вmain функция включает вызов функции в try...catch блок.

Код должен выдать следующее output -

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