Dart — Manejo de errores


El manejo de errores en los lenguajes de programación es parte esencial para la seguridad y comportamientos inesperados dentro de una aplicación.


Excepciones

Las excepciones en Dart, se utilizan para indicar que algo inesperado sucedió en el código y así tener errores controlados. Las excepciones se pueden lanzar y capturar, si una excepción no es capturada puede repercutir en la terminación de la aplicación y así mismo deja de funcionar.

Dart proporciona tipos de excepción y error, así como numerosos subtipos predefinidos. También podemos definir excepciones propias.

Throw

Para lanzar las excepciones se utiliza la palabra clave throw.

throw FormatException('Formato incorrecto.');

también es posible lanzar otro tipo de objetos como un String por ejemplo.

throw 'Error no controlado';

algunos tipos de error y excepciones que tiene Dart.

throw ArgumentError();
throw AssertionError();
throw ConcurrentModificationError();
throw OutOfMemoryError();
throw ParallelWaitError('Error', 'values');
throw StackOverflowError();
throw StateError('State error');
throw TypeError();
throw UnimplementedError();
throw UnsupportedError('error no soportado');

throw FormatException();
throw IntegerDivisionByZeroException();

Debido a que el lanzar una excepción es una expresión se puede lanzar excepciones en sentencias =>.

void printException() => throw ArgumentError();

void main() {
  printException();

}

Catch

Al capturar una excepción detenemos la propagación de la misma en el programa. Al capturar una excepción podemos determinar el siguiente paso que queremos dar de acuerdo al flujo que necesitemos.

void exceptionFunction() => throw CustomException('Error personalizado.');

void main() {
  try {
    exceptionFunction();
  } on CustomException {
    print('Capturamos la excepción');
  }
}

Para manejar código que puede lanzar más de un tipo de excepción, puede especificar varios on y catch.

void exceptionFunction() => throw CustomException('Error personalizado.');

void main() {
  try {
    throw Exception();
  } on CustomException {
    // cuando ocurre una excepción personalizada
    exceptionFunction();
  } on Exception catch (e) {
    // cuando ocurre otro tipo de excepción
    print('Excepción: $e');
  } catch (e) {
    // Cuando no hay un tipo de excepción especificado
    print('Excepción no conocida: $e');
  }
}

Es recomendado usar on cuando necesita especificar el tipo de excepción, el catch cuando el manejador de excepciones necesita el objeto de la excepción. Se puede especificar 2 parámetros dentro de el catch (e, s), el primero es el objeto de la excepción y el segundo la traza del error StackTrace.

void main() {
  try {
    throw Exception();
  } on CustomException {
    // cuando ocurre una excepción personalizada
    exceptionFunction();
  } on Exception catch (e, s) {
    // cuando ocurre otro tipo de excepción
    print('Excepción: $e');
    print('StackTrace: $s');
  } catch (e) {
    // Cuando no hay un tipo de excepción especificado
    print('Excepción no conocida: $e');
  }
}

Para manejar parcialmente una excepción y esperar que se propague se puede usar la palabra rethrow.

dynamic divide(dynamic num1, dynamic num2) {
  try {
    return num1 / num2;
  } catch (e) {
    print('Error: ${e.runtimeType}.');
    rethrow; // permite llamar la excepción del main()
  }
}

void main() {
  try {
    divide('one', -10);
  } catch (e) {
    print('main() Error: ${e.runtimeType}.');
  }
}

Finally

Como vimos en algunas publicaciones atrás, el finally se utiliza para ejecutar algo que queremos que se haga independientemente si ocurre o no una excepción.

void main() {
  try {
    throw FormatException('Formato inválido');
  } catch (e) {
    print('Error: $e'); // ocurre un error
  } finally {
    print('Ejecutar siempre!'); // después de ejecutar el error
  }
}

Assert

Los asserts nos sirven para la etapa de desarrollo ir validando que nuestro código está funcionando correctamente, se puede decir que es una especie de depuración, en producción los asserts que tengamos en código son ignorados.

void main() {
  var number = 99;
  var url = 'https://';

  assert(number < 100);
  assert(url.startsWith('https'));
}

Conclusión

Vimos de manera general cómo funciona el manejo de excepciones en Dart, es muy similar a la forma que se hace en otros lenguajes orientados a objetos.

Siguientes pasos

Veremos un par de temas más antes de pasar a aprender sobre Dart, primero vamos con los enums.

Fuentes

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *