Programación de dardos: excepciones
Una excepción (o evento excepcional) es un problema que surge durante la ejecución de un programa. Cuando ocurre una excepción, el flujo normal del programa se interrumpe y el programa / aplicación finaliza de manera anormal.
Las excepciones de Dart incorporadas incluyen:
No Señor | Excepciones y descripción |
---|---|
1 |
DeferredLoadException Se lanza cuando una biblioteca diferida no se carga. |
2 |
FormatException Se lanza una excepción cuando una cadena u otros datos no tienen el formato esperado y no se pueden analizar ni procesar. |
3 |
IntegerDivisionByZeroException Se lanza cuando un número se divide por cero. |
4 |
IOException Clase base para todas las excepciones relacionadas con Inupt-Output. |
5 |
IsolateSpawnException Se lanza cuando no se puede crear un aislamiento. |
6 |
Timeout Se lanza cuando se agota el tiempo de espera programado mientras se espera un resultado asincrónico. |
Cada excepción en Dart es un subtipo de la clase predefinida Exception. Se deben manejar las excepciones para evitar que la aplicación finalice abruptamente.
Los bloques try / on / catch
los tryblock incrusta código que posiblemente podría resultar en una excepción. El bloque on se utiliza cuando es necesario especificar el tipo de excepción. loscatch El bloque se usa cuando el controlador necesita el objeto de excepción.
los try El bloque debe ir seguido de exactamente uno on / catch bloque o uno finallybloque (o uno de ambos). Cuando ocurre una excepción en el bloque try, el control se transfiere alcatch.
los syntax para manejar una excepción es como se indica a continuación:
try {
// code that might throw an exception
}
on Exception1 {
// code for handling exception
}
catch Exception2 {
// code for handling exception
}
A continuación se presentan algunos puntos para recordar:
Un fragmento de código puede tener más de un bloque on / catch para manejar múltiples excepciones.
El bloque on y el bloque catch son mutuamente inclusivos, es decir, un bloque try se puede asociar tanto con el bloque on como con el bloque catch.
El siguiente código ilustra el manejo de excepciones en Dart:
Ejemplo: usar el bloque ON
El siguiente programa divide dos números representados por las variables x y yrespectivamente. El código lanza una excepción ya que intenta la división por cero. loson block contiene el código para manejar esta excepción.
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
on IntegerDivisionByZeroException {
print('Cannot divide by zero');
}
}
Debería producir lo siguiente output -
Cannot divide by zero
Ejemplo: usar el bloque de captura
En el siguiente ejemplo, hemos utilizado el mismo código que el anterior. La única diferencia es que elcatch block(en lugar del bloque ON) aquí contiene el código para manejar la excepción. El parámetro decatch contiene el objeto de excepción lanzado en tiempo de ejecución.
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
catch(e) {
print(e);
}
}
Debería producir lo siguiente output -
IntegerDivisionByZeroException
Ejemplo: en ... captura
El siguiente ejemplo muestra cómo utilizar el on...catch bloquear.
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
on IntegerDivisionByZeroException catch(e) {
print(e);
}
}
Debería producir lo siguiente output -
IntegerDivisionByZeroException
El bloque finalmente
los finallyEl bloque incluye código que debe ejecutarse independientemente de la ocurrencia de una excepción. El opcionalfinally bloque se ejecuta incondicionalmente después try/on/catch.
La sintaxis para usar el finally el bloque es el siguiente:
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
}
El siguiente ejemplo ilustra el uso de finally bloquear.
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');
}
}
Debería producir lo siguiente output -
Cannot divide by zero
Finally block executed
Lanzar una excepción
los throwLa palabra clave se utiliza para generar una excepción explícitamente. Se debe manejar una excepción planteada para evitar que el programa se cierre abruptamente.
los syntax para plantear una excepción explícitamente es -
throw new Exception_name()
Ejemplo
El siguiente ejemplo muestra cómo utilizar el throw palabra clave para lanzar una excepción -
main() {
try {
test_age(-2);
}
catch(e) {
print('Age cannot be negative');
}
}
void test_age(int age) {
if(age<0) {
throw new FormatException();
}
}
Debería producir lo siguiente output -
Age cannot be negative
Excepciones personalizadas
Como se especificó anteriormente, cada tipo de excepción en Dart es un subtipo de la clase incorporada Exception. Dart permite la creación de excepciones personalizadas ampliando las existentes. La sintaxis para definir una excepción personalizada es la siguiente:
Sintaxis: Definición de la excepción
class Custom_exception_Name implements Exception {
// can contain constructors, variables and methods
}
Las excepciones personalizadas deben plantearse explícitamente y las mismas deben manejarse en el código.
Ejemplo
El siguiente ejemplo muestra cómo definir y manejar una excepción 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();
}
}
En el código anterior, estamos definiendo una excepción personalizada, AmtException. El código genera la excepción si la cantidad pasada no está dentro del rango exceptuado. losmain función encierra la invocación de la función en el try...catch bloquear.
El código debería producir lo siguiente output -
Amount should be greater than zero
Ending requested operation....