Error de tipo
Operación entre tipos incompatibles.
"No podi usar '+' entre un 'numero' y un 'texto'..."
En Piola hay dos categorías de cosas que pueden salir mal: los errores de runtime que el lenguaje lanza automáticamente, y los errores que tú capturas con ojo/cago. Ambos hablan chileno.
ojo / cago — try / catchEnvuelve en ojo el código que puede fallar. Si algo explota, cago lo captura.
ojo { wea resultado = 10 / 0} cago(error) { altiro("La cagó: " + error)}// → La cagó: Weon, no se puede dividir por cero.error dentro del cago es un texto con el mensaje del error. Puedes llamarlo como quieras:
ojo { altiro(lista_inexistente)} cago(e) { altiro("Oe: " + e)}// → Oe: La wea 'lista_inexistente' no existe papito.Cualquier error de runtime puede ser atrapado con ojo/cago. Estos son todos los que Piola puede lanzar:
ojo { wea x = "fósforos" + 42} cago(error) { altiro(error)}// → No podi usar '+' entre un 'texto' y un 'numero' pedazo de saco wea.ojo { altiro(boleta_electronica)} cago(error) { altiro(error)}// → La wea 'boleta_electronica' no existe papito.ojo { wea promedio = 100 / 0} cago(error) { altiro(error)}// → Weon, no se puede dividir por cero.wea fila_banco = ["señora Rosa", "don Lucho", "el cabro chico"]
ojo { altiro(fila_banco[99])} cago(error) { altiro(error)}// → Te fuiste al chancho, el índice 99 no existe en la lista (largo: 3).wea tramite = {"nombre": "certificado de residencia", "costo": 0}
ojo { altiro(tramite["tiempo_estimado"])} cago(error) { altiro(error)}// → La clave 'tiempo_estimado' no existe papito.duro PRECIO_MICRO = 800
ojo { PRECIO_MICRO = 750} cago(error) { altiro(error)}// → Oe, 'PRECIO_MICRO' es duro, no lo podí cambiar.pega recargar_bip(monto) { "Recargando $" + monto}
ojo { recargar_bip(500, "efectivo", "por favor")} cago(error) { altiro(error)}// → La pega espera 1 args, le pasaste 3.wea direccion = "Avenida Libertador Bernardo O'Higgins 1234"
ojo { direccion()} cago(error) { altiro(error)}// → 'texto' no es una pega papito.ojo/cago anidadosPuedes anidar bloques para manejar errores en distintos niveles:
// Simulando un trámite en el Registro Civilpega buscar_documento(rut) { cachai (rut == nada) { wea lista = [] devolver lista[-1] // Error a propósito } "Documento de " + rut}
ojo { ojo { wea doc = buscar_documento(nada) altiro(doc) } cago(error_interno) { altiro("Error buscando documento: " + error_interno) // podríamos relanzar o manejar acá }
altiro("Trámite completado")
} cago(error_externo) { altiro("Error general del sistema: " + error_externo)}ojo/cago NO capturaLas señales de control de flujo no son errores — pasan a través del ojo sin ser capturadas:
para (i en [1, 2, 3, 4, 5]) { ojo { cachai (i == 3) { cortala // ← esto NO lo atrapa el cago } altiro(i) } cago(e) { altiro("error: " + e) }}// → 1// → 2// (se corta en 3, el cortala sale del bucle correctamente)Lo mismo con sigue y devolver — son control de flujo, no errores.
Estos ocurren antes de que el programa corra, no durante. No se pueden capturar con ojo/cago porque Piola ni llega a ejecutar el código.
// Este archivo no corre en absoluto:wea x = @#$
Error léxico × Carácter inesperado '@'. ╭─[programa.cl:1:9] 1 │ wea x = @#$ · ┬ · ╰── Carácter inesperado '@'. ╰────Error de tipo
Operación entre tipos incompatibles.
"No podi usar '+' entre un 'numero' y un 'texto'..."
Variable no definida
Usar una variable que no fue declarada.
"La wea 'x' no existe papito."
División por cero
Dividir o hacer módulo con cero.
"Weon, no se puede dividir por cero."
Índice inválido
Acceder fuera del rango de una lista.
"Te fuiste al chancho, el índice N no existe..."
Clave inexistente
Acceder a una clave que no existe en un mapa.
"La clave 'x' no existe papito."
Constante inmutable
Intentar modificar una variable duro.
"Oe, 'X' es duro, no lo podí cambiar."
Argumentos incorrectos
Llamar una función con el número equivocado de argumentos.
"La pega espera N args, le pasaste M."
No es una función
Intentar llamar algo que no es una pega.
"'texto' no es una pega papito."
En vez de envolver todo en un ojo gigante, captura cerca del origen del problema:
// ✗ Demasiado amplio — no sabes qué fallóojo { wea datos = obtener_datos() wea procesado = procesar(datos) wea resultado = guardar(procesado) altiro(resultado)} cago(e) { altiro("algo falló: " + e)}
// ✓ Captura específica — sabes exactamente qué y dóndewea datos = nada
ojo { datos = obtener_datos()} cago(e) { altiro("No se pudieron obtener los datos: " + e)}
cachai (datos != nada) { wea procesado = procesar(datos) altiro(procesado)}