Errores
T! para lo que puede fallar, o, atrapar e intentar.
Un opcional (T?, lección 7) dice que un valor puede faltar. Cuando una operación puede fallar y quieres explicar por qué, devuelve un resultado T! (.Ok / .Error("mensaje")).
| Forma | Uso |
|---|---|
x o 0 | Valor por defecto si hay error (igual que con opcionales) |
x atrapar |error| | Maneja el error: lo recibe en error |
intentar x | Si falla, la función actual devuelve ese error |
fn dividir(a entero, b entero) entero!
si b == 0
retornar .Error("no se puede dividir entre cero")
a / b
fn mitad(a entero, b entero) entero!
var r = intentar dividir(a, b)
r / 2
Descartar un resultado sin mirarlo es un error de compilación: Cometa te obliga a decidir qué pasa si algo sale mal. T!E permite un tipo de error propio.
Programa completo
// Errores (T!): operaciones que pueden fallar y explican por qué.
// entero! devuelve un entero o un error con un mensaje.
fn dividir(a entero, b entero) entero!
si b == 0
retornar .Error("no se puede dividir entre cero")
a / b
// intentar pasa el error hacia arriba si la operación falla.
fn mitad_de_division(a entero, b entero) entero!
var resultado = intentar dividir(a, b)
resultado / 2
// ! solo: la operación no devuelve nada, pero puede fallar.
fn retirar(saldo entero, monto entero) !
si monto > saldo
retornar .Error("saldo insuficiente")
imprimir("Retiraste ${monto}")
.Ok
fn inicio()
// o: un valor por defecto si hay un error (funciona igual que con opcionales).
var bien = dividir(10, 2) o 0
imprimir(bien)
// atrapar con |error|: un bloque decide qué hacer con el error.
var mal = dividir(10, 0) atrapar |error|
imprimir("Error: ${error}")
-1
imprimir(mal)
// El error de dividir sube a través de mitad_de_division.
imprimir(mitad_de_division(20, 2) o 0)
imprimir(mitad_de_division(20, 0) o 0)
// Un resultado sin valor también hay que revisarlo.
retirar(100, 30) atrapar |error|
imprimir("No se pudo: ${error}")
retirar(100, 500) atrapar |error|
imprimir("No se pudo: ${error}")