Programação Dart - Exceções

Uma exceção (ou evento excepcional) é um problema que surge durante a execução de um programa. Quando ocorre uma exceção, o fluxo normal do programa é interrompido e o programa / aplicativo é encerrado de forma anormal.

As exceções integradas do Dart incluem -

Sr. Não Exceções e descrição
1

DeferredLoadException

Lançado quando uma biblioteca adiada falha ao carregar.

2

FormatException

Exceção lançada quando uma string ou algum outro dado não tem um formato esperado e não pode ser analisado ou processado.

3

IntegerDivisionByZeroException

Lançado quando um número é dividido por zero.

4

IOException

Classe base para todas as exceções relacionadas a Inupt-Output.

5

IsolateSpawnException

Lançado quando um isolado não pode ser criado.

6

Timeout

Lançado quando ocorre um tempo limite programado durante a espera por um resultado assíncrono.

Cada exceção no Dart é um subtipo da classe predefinida Exception. As exceções devem ser tratadas para evitar que o aplicativo seja encerrado abruptamente.

Os blocos try / on / catch

o tryo bloco incorpora código que possivelmente pode resultar em uma exceção. O bloco on é usado quando o tipo de exceção precisa ser especificado. ocatch bloco é usado quando o manipulador precisa do objeto de exceção.

o try bloco deve ser seguido por exatamente um on / catch bloco ou um finallybloco (ou um de ambos). Quando ocorre uma exceção no bloco try, o controle é transferido para ocatch.

o syntax para lidar com uma exceção é como fornecido abaixo -

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

A seguir estão alguns pontos a serem lembrados -

  • Um trecho de código pode ter mais de um bloco on / catch para lidar com várias exceções.

  • O bloco on e o bloco catch são mutuamente inclusivos, ou seja, um bloco try pode ser associado a ambos - o bloco on e o bloco catch.

O código a seguir ilustra o tratamento de exceções no Dart -

Exemplo: Usando o Bloco ON

O programa a seguir divide dois números representados pelas variáveis x e yrespectivamente. O código lança uma exceção, pois tenta a divisão por zero. oon block contém o código para lidar com essa exceção.

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

Deve produzir o seguinte output -

Cannot divide by zero

Exemplo: usando o bloco catch

No exemplo a seguir, usamos o mesmo código acima. A única diferença é que ocatch block(em vez do bloco ON) aqui contém o código para tratar a exceção. O parâmetro decatch contém o objeto de exceção lançado no tempo de execução.

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

Deve produzir o seguinte output -

IntegerDivisionByZeroException

Exemplo: on ... catch

O exemplo a seguir mostra como usar o on...catch quadra.

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

Deve produzir o seguinte output -

IntegerDivisionByZeroException

O bloco finalmente

o finallybloco inclui código que deve ser executado independentemente da ocorrência de uma exceção. O opcionalfinally bloco é executado incondicionalmente após try/on/catch.

A sintaxe para usar o finally bloco é o seguinte -

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 
}

O exemplo a seguir ilustra o uso de finally quadra.

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

Deve produzir o seguinte output -

Cannot divide by zero 
Finally block executed

Lançando uma exceção

o throwpalavra-chave é usada para gerar uma exceção explicitamente. Uma exceção levantada deve ser tratada para evitar que o programa saia abruptamente.

o syntax para levantar uma exceção explicitamente é -

throw new Exception_name()

Exemplo

O exemplo a seguir mostra como usar o throw palavra-chave para lançar uma exceção -

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

Deve produzir o seguinte output -

Age cannot be negative

Exceções personalizadas

Conforme especificado acima, cada tipo de exceção no Dart é um subtipo da classe integrada Exception. O Dart permite a criação de exceções personalizadas, estendendo as existentes. A sintaxe para definir uma exceção personalizada é fornecida a seguir -

Sintaxe: Definindo a exceção

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

Exceções personalizadas devem ser levantadas explicitamente e as mesmas devem ser tratadas no código.

Exemplo

O exemplo a seguir mostra como definir e tratar uma exceção personalizada.

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

No código acima, estamos definindo uma exceção personalizada, AmtException. O código gera a exceção se o valor transmitido não estiver dentro da faixa de exceção. omain função inclui a invocação da função no try...catch quadra.

O código deve produzir o seguinte output -

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