Dart:
Manejo de errores

Cómo hacerlo:

Dart soporta dos tipos de errores: errores en tiempo de compilación y errores en tiempo de ejecución. Los errores en tiempo de compilación son detectados por el analizador de Dart antes de que el código se ejecute, mientras que los errores en tiempo de ejecución, o excepciones, ocurren durante la ejecución. Aquí está cómo manejar excepciones en Dart:

Try-Catch

Usa try-catch para capturar excepciones y prevenir que hagan colapsar tu aplicación:

try {
  var result = 100 ~/ 0; // Intentando división por cero, lanza una excepción
} catch (e) {
  print('Capturada una excepción: $e'); // Maneja la excepción
}

Salida de muestra: Capturada una excepción: IntegerDivisionByZeroException

Excepción Específica

Para manejar excepciones específicas, menciona la excepción después de catch:

try {
  var result = 100 ~/ 0;
} on IntegerDivisionByZeroException {
  print('No se puede dividir por cero.'); // Maneja específicamente las excepciones de división por cero
}

Salida de muestra: No se puede dividir por cero.

Rastreo de Pila

Para obtener un rastreo de pila para la depuración, usa un segundo parámetro en el bloque catch:

try {
  var result = 100 ~/ 0;
} catch (e, s) {
  print('Excepción: $e');
  print('Rastreo de pila: $s'); // Imprime el rastreo de pila para depuración
}

Finalmente

Usa finally para ejecutar código después de try/catch, independientemente de si se lanzó una excepción:

try {
  var result = 100 ~/ 0;
} catch (e) {
  print('Capturada una excepción: $e');
} finally {
  print('Esto siempre se ejecuta.'); // Código de limpieza o pasos finales
}

Salida de muestra:

Capturada una excepción: IntegerDivisionByZeroException
Esto siempre se ejecuta.

Bibliotecas de Terceros

Aunque la biblioteca central de Dart es robusta para el manejo de errores, también puedes usar paquetes de terceros como dartz para la programación funcional, lo cual introduce conceptos como Either y Option que pueden ser usados para el manejo de errores. Aquí hay un ejemplo usando dartz para el manejo de errores:

  1. Agrega dartz a tu archivo pubspec.yaml bajo dependencias:
dependencies:
  dartz: ^0.10.0
  1. Usa Either para manejar errores de manera elegante en tu código Dart:
import 'package:dartz/dartz.dart';

Either<String, int> divide(int dividendo, int divisor) {
  if (divisor == 0) {
    return Left('No se puede dividir por cero.');
  } else {
    return Right(dividendo ~/ divisor);
  }
}

void main() {
  final result = divide(100, 0);
  result.fold(
    (left) => print('Error: $left'), 
    (right) => print('Resultado: $right')
  );
}

Salida de muestra: Error: No se puede dividir por cero.

La parte Left usualmente representa el error, y la parte Right representa el éxito. Este patrón permite manejar errores de una manera más funcional, ofreciendo claridad y control sobre la gestión de errores.