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....