Manejo de Errores en Profundidad
Clean Language tiene un sistema de errores directo y explícito. Señalas errores con error() y los gestionas en el punto de llamada con onError. Los errores son visibles en el código — decides exactamente dónde se capturan y cuál es el valor de respaldo, sin pilas de excepciones ocultas.
Señala errores con error() y captúralos con onError en el lugar de llamada:
functions:\n number safe_divide(number a, number b)\n if b == 0.0\n error("Division by zero")\n return a / b\n\nstart:\n number good = safe_divide(10.0, 2.0)\n print("10 / 2 = " + good.toString())\n\n number safe = safe_divide(10.0, 0.0) onError -1.0\n print("10 / 0 = " + safe.toString() + " (used fallback)")10 / 2 = 5.0\n10 / 0 = -1.0 (used fallback)error("mensaje") señala un error desde dentro de una función. En el lugar de llamada, agregar onError VALOR proporciona un respaldo — si la función tiene un error, obtienes el valor de respaldo en lugar de un fallo. Cada lugar de llamada decide su propio respaldo de forma independiente.
Encadena la validación y onError para construir analizadores robustos:
functions:\n integer parse_age(string input)\n if input.length() == 0\n error("Age cannot be empty")\n integer age = input.toInteger() onError -1\n if age < 0\n error("Age must be positive")\n if age > 150\n error("Age is unrealistically high")\n return age\n\nstart:\n integer a = parse_age("28")\n print("Valid: " + a.toString())\n\n integer b = parse_age("") onError 0\n print("Empty fallback: " + b.toString())\n\n integer c = parse_age("abc") onError 0\n print("Invalid fallback: " + c.toString())Valid: 28\nEmpty fallback: 0\nInvalid fallback: 0onError puede usarse en cualquier expresión, incluso en otro resultado onError. input.toInteger() falla en entradas no numéricas, y onError -1 lo captura; luego if age < 0 señala un nuevo error, capturado por el llamador. Esto encadena la validación de forma natural.
Resumen rápido
- error("mensaje") señala un error — la ejecución se detiene en ese punto de la función
- funcion() onError VALOR proporciona un respaldo si la función señala un error
- onError es local — cada lugar de llamada decide su propio respaldo de forma independiente
- Encadena onError: toInteger() onError -1 convierte los fallos de análisis en un valor centinela