// lección 10

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")).

FormaUso
x o 0Valor por defecto si hay error (igual que con opcionales)
x atrapar |error|Maneja el error: lo recibe en error
intentar xSi 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

10_errores.cometa
// 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}")