Lección 18 · 18 de 20
Excepciones · Dart
Controle los errores en Dart con try, on, catch y finally, y lance los suyos con throw: un cajero que rechaza importes negativos o sin saldo.

Cuando algo sale mal, Dart lanza una excepción y, si nadie la atiende, el programa se detiene. `try` marca el código que puede fallar y `on FormatException` atiende ese tipo de error: int.parse('forty') falla, se escribe el aviso y el bucle sigue con normalidad.
`throw` lanza una excepción propia cuando algo no está permitido. withdraw lanza un `ArgumentError` si el importe no es positivo y un `StateError` si no hay saldo suficiente; en los dos casos no llega al return, así que balance no cambia.
Un try puede tener varias ramas, que Dart prueba en orden. `on ArgumentError catch (e)` atiende ese tipo y guarda el error en e, cuyo message es el texto del throw. Un `catch (e)` sin on atiende cualquier otro error: el StateError se escribe entero como Bad state: not enough money.
`finally` se ejecuta siempre, haya error o no, y por eso cada operación termina con su línea checked. Es el sitio para lo que tiene que hacerse pase lo que pase, como cerrar un archivo.
Al final, el saldo es 70.0: solo la primera retirada salió bien, y las otras dos se rechazaron sin detener el programa.
Código · main.dart
// throw raises an error when something is not allowed.double withdraw(double balance, double amount) { if (amount <= 0) throw ArgumentError('the amount must be positive'); if (amount > balance) throw StateError('not enough money'); return balance - amount;}void main() { // int.parse fails with a FormatException on bad text. for (var text in ['42', 'forty']) { try { print('Read: ${int.parse(text)}'); } on FormatException { print('"$text" is not a number'); } } // on catches one type of error; catch (e) gives the error itself. double balance = 100; for (var amount in [30.0, -5.0, 500.0]) { try { balance = withdraw(balance, amount); print('Took out $amount, balance $balance'); } on ArgumentError catch (e) { print('Refused: ${e.message}'); } catch (e) { print('Error: $e'); } finally { // finally always runs, with or without an error. print(' operation of $amount checked'); } } print('Final balance: $balance');}Salida · dart run main.dart
Read: 42 "forty" is not a number Took out 30.0, balance 70.0 operation of 30.0 checked Refused: the amount must be positive operation of -5.0 checked Error: Bad state: not enough money operation of 500.0 checked Final balance: 70.0
Para recordar
try { }envuelve el código que puede fallar.on Tipoatiende un tipo de error;catch (e)da el error.throw ArgumentError('...')lanza un error propio.finallyse ejecuta siempre.- Un error atendido no detiene el programa.
Ejercicio
Añada una función deposit que lance un ArgumentError si el importe es mayor de 1000 y pruébela dentro de un try con tres importes, uno de ellos de 2000.