Errores
Cada error dice de qué tipo es, qué pasó, dónde y casi siempre una pista. Esta lista se genera desde el catálogo del intérprete. Los más comunes al empezar están explicados en errores comunes.
Léxicos: el texto tiene algo que no es una pieza válida
- CARÁCTER_DESCONOCIDO
- El código tiene un carácter que Codexivo no usa, como
&,|o@. Suele pasar al copiar código de otro lenguaje o de un documento: las comillas tipográficas (“ ”) no son comillas de código. Para «y» y «o» se escriben las palabrasyyo. - COMENTARIO_SIN_CERRAR
- Un comentario
/*sigue hasta encontrar*/. Si falta el cierre, todo lo que viene después queda dentro del comentario y no se ejecuta. - ESCAPE_DESCONOCIDO
- Dentro de un texto,
\empieza una secuencia de escape. Las válidas son\n(salto de línea),\t(tabulador),\\,\"y\'. Para escribir una diagonal invertida se escribe dos veces. - NOMBRE_EMPIEZA_CON_NÚMERO
- Los nombres pueden llevar dígitos, pero no al principio:
x2es un nombre y2xno. Si querías multiplicar, escribe el operador:2 * x. - SEPARADOR_INVÁLIDO
- En los números,
_solo sirve para separar grupos de dígitos y que se lean mejor:1_000_000. Tiene que ir entre dos dígitos;1__0o1_no son números. - TEXTO_SIN_CERRAR
- Un texto empieza y termina con la misma comilla, en la misma línea. Si falta la comilla final, Codexivo no sabe dónde termina. Para un salto de línea dentro del texto usa
\n.
De sintaxis: las piezas no forman un programa
- ANIDAMIENTO_EXCESIVO
- La expresión tiene demasiados niveles de paréntesis o de operaciones anidadas. Guarda partes en variables intermedias: además de evitar el error, el programa se lee mejor.
- ASIGNACIÓN_INVÁLIDA
- A la izquierda de
=(o de+=,++…) tiene que ir algo que pueda guardar un valor: una variable (x = 1), un elemento (lista[0] = 1) o un campo (persona.edad = 16).5 = xof(x) = 1no tienen dónde guardarlo. - BLOQUE_SIN_CERRAR
- Cada
{necesita su}. El error señala la llave que abrió el bloque; revisa que cadasi,mientraso procedimiento cierre su bloque antes de que empiece lo que sigue. - CAMPO_ESPERADO
- Después de
.va el nombre de un campo de un diccionario:persona.edad. Solo funciona con claves que son nombres válidos y que no son palabras reservadas; para las demás se escribed["clave"]. - CLAVE_REPETIDA
- Un diccionario escrito entre llaves tiene la misma clave dos veces. Solo se quedaría el último valor, así que casi siempre es un error de copiar y pegar.
- CLAVE_SIN_COMILLAS
- Las claves de un diccionario son textos o números, y los textos van entre comillas:
{ "nombre": "Ana" }. Si querías usar el valor de una variable como clave, escríbela entre paréntesis:{ (clave): 1 }. - COMPARACIÓN_ENCADENADA
1 < x < 5parece natural, pero esconde dos comparaciones. En Codexivo se escriben las dos y se unen cony:1 < x y x < 5.- CONTINUAR_FUERA_DE_BUCLE
continuarsalta a la siguiente vuelta del bucle más cercano, así que solo tiene sentido dentro de uno. Dentro de un procedimiento no afecta al bucle desde donde se llamó.- DICCIONARIO_COMO_SENTENCIA
- Al inicio de una sentencia,
{abre un bloque. Un diccionario tiene que estar en una expresión: guárdalo en una variable (variable d = { "a": 1 }) o pásalo a un procedimiento. - DOMINIO_SOLO_DECLARACIONES
- Un
dominioes un espacio de nombres: solo agrupa declaraciones (variable,constante,procedimientoy otrosdominio). El código que hace algo, como unsio unimprimir, va dentro de un procedimiento del dominio o fuera de él. - EN_SIN_PARA_CADA
enes parte depara_cada elemento en lista { … }y no se puede usar sola ni como nombre.- EXPRESIÓN_ESPERADA
- En ese lugar iba un valor (un número, un texto, una variable, una llamada…) y apareció otra cosa. Suele faltar un operando, como en
x = * 2, o se usó una palabra reservada como si fuera un nombre. - EXPRESIÓN_INCOMPLETA
- El programa terminó a mitad de una expresión, como en
x = 1 +. Revisa que no falte el último valor. - FIN_DE_SENTENCIA
- Dos sentencias en la misma línea tienen que separarse con
;. Si querías combinar dos valores, falta un operador entre ellos:1 2no significa nada, pero1 + 2sí. - HASTA_QUE_SIN_HACER
hasta_que (condición)cierra un buclehacer { … }y tiene que ir justo después de su}. Para repetir mientras algo sea verdadero, usamientras.- INCREMENTO_EN_EXPRESIÓN
i++ei--son sentencias: cambian la variable y nada más. No se pueden usar dentro de una expresión (x = i++) ni antes del nombre (++i). Escribei++en su propia línea y después usai.- ÍNDICE_VACÍO
- Entre los corchetes va la posición o la clave:
lista[0],d["nombre"]. - LLAVE_SOBRANTE
- Hay una
}que no cierra ningún bloque. Suele ser una llave de más, o una que falta más arriba. - NOMBRE_ESPERADO
- Después de
variable,constante,procedimientoopara_cadava un nombre: letras, dígitos y_, sin empezar con dígito. - NOMBRE_REPETIDO
- Un procedimiento con nombre existe desde el inicio de su bloque, para poder llamarlo antes de la línea donde se escribe. Por eso su nombre no se puede repetir en el mismo bloque, ni con otro procedimiento ni con una variable.
- PALABRA_DESCONOCIDA
- Se parece a una palabra de Codexivo, pero no lo es. Las palabras compuestas llevan guion bajo:
si_no,pero_si,hasta_que. - PALABRA_RESERVADA
- Las palabras reservadas (
si,mientras,y,veces,mod…) tienen un significado fijo y no se pueden usar como nombres. Elige otro nombre, por ejemplo agregando una palabra:valor_inicial. - PARÁMETRO_REPETIDO
- Dos parámetros de un procedimiento (o las dos variables de un
para_cada) tienen el mismo nombre, así que no habría forma de distinguirlos. - PROCEDIMIENTO_CON_NOMBRE
procedimiento nombre(…) { … }es una sentencia y no puede ir dentro de una expresión. Como valor, el procedimiento se escribe sin nombre:variable doble = procedimiento(x) { regresa x * 2 }.- RAMA_SIN_SI
pero_siysi_nocontinúan unsiy van justo después de la}de su bloque. Una sentencia en medio rompe la cadena.- REPETIR_SIN_CANTIDAD
- Falta cuántas veces se repite el bloque. La forma completa es
repetir 4 veces { … }. - ROMPER_FUERA_DE_BUCLE
rompersale del bucle más cercano, así que solo tiene sentido dentro de uno. Para salir de un procedimiento se usaregresa.- SENTENCIA_EN_EXPRESIÓN
- Palabras como
si,mientrasovariableempiezan una sentencia y no dan un valor, así que no pueden ir donde se espera uno, como a la derecha de=. - SI_NO_SI
- Después de
si_nova directamente un bloque. Para probar otra condición se usapero_si (condición) { … }. - TOKEN_ESPERADO
- Falta un símbolo o una palabra que la sentencia necesita, como el
(de una condición o elvecesderepetir. El mensaje dice qué se esperaba y qué se encontró.
De análisis: el editor lo ve antes de ejecutar
- CÓDIGO_INALCANZABLE
- Hay sentencias después de un
regresa, unrompero uncontinuar(o de unsien el que todas las ramas salen) dentro del mismo bloque. Como el salto ocurre antes, esas sentencias nunca se ejecutan. Si tienen que ejecutarse, van antes del salto; si no, sobran. - CONDICIÓN_CONSTANTE
- La condición es
verdaderoofalsoescrito tal cual, así que siempre decide lo mismo: la rama se ejecuta siempre o nunca, o el bucle no entra. Casi siempre faltó la comparación (si (x es_mayor_que 0)).mientras (verdadero)con unromperadentro no avisa: es una forma normal de escribir un bucle. - PARÁMETRO_SIN_USO
- El procedimiento recibe un valor que no usa en su cuerpo. Puede que falte usarlo, que el nombre esté mal escrito adentro, o que ya no haga falta: en ese caso se quita de la declaración y de todas las llamadas.
- PROCEDIMIENTO_SIN_USO
- Se declaró un procedimiento (o un dominio) y el programa nunca lo llama ni lo usa. No es un error, pero suele indicar un nombre mal escrito en la llamada o código que sobró. Un reto que llama a
resolver(…)desde fuera no avisa. - VARIABLE_SIN_USO
- Una variable o constante se declara (o se le asignan valores) pero nunca se lee. El programa funciona igual sin ella, así que o sobra o faltó usarla. Con la variable de un
parao unpara_cadael aviso es una sugerencia: si solo se cuentan vueltas,repetir n veceslo dice más claro.
De ejecución: el programa hizo algo que no se puede
- AFIRMACIÓN_FALLIDA
- Una llamada a
afirmar(condición, mensaje)encontró que su condición era falsa. Afirmar es escribir lo que esperas que sea cierto en ese punto del programa; si no lo es, el programa se detiene ahí, antes de que el error llegue más lejos. Revisa los valores de las variables justo antes de esa línea. - CANTIDAD_DE_ARGUMENTOS
- Un procedimiento se llama con exactamente tantos valores como parámetros tiene. Si faltan o sobran, es un error: Codexivo no rellena los que faltan.
- CHOQUE_CON_PARED
- El robot intentó avanzar hacia una pared o fuera del mundo. Antes de
avanzar(), pregunta confrente_libre(). - CLAVE_INEXISTENTE
- Se leyó una clave que el diccionario no tiene. Pregunta antes con
tiene(d, clave), o revisa que la clave esté bien escrita:"Edad"y"edad"son distintas, igual que1y"1". - CLAVE_INVÁLIDA
- Las claves de un diccionario son textos o números. Una lista, un lógico o
nulono pueden ser clave. - COLA_VACÍA
- Se intentó sacar o consultar el frente de una cola que no tiene nada. Revisa antes con
longitud(cola) > 0. - COMPARACIÓN_INVÁLIDA
<,>,<=y>=comparan dos números o dos textos. Comparar un número con un texto no tiene un orden claro; convierte uno de los dos connúmero(…)otexto(…).- CONDICIÓN_NO_LÓGICA
- Las condiciones de
si,mientras,hasta_queyparatienen que serverdaderoofalso. En otros lenguajessi (x)funciona con números; en Codexivo se dice lo que se quiere preguntar:si (x es_distinto_de 0). - CONSTANTE_REASIGNADA
- Una
constanteno cambia de valor. Si necesitas cambiarlo, declárala convariableen lugar deconstante. - DICCIONARIO_MODIFICADO_AL_RECORRER
- Se agregaron o quitaron claves de un diccionario mientras
para_cadalo recorría. Recorreclaves(d), que es una lista nueva, o junta los cambios y aplícalos al terminar. - DIVISIÓN_ENTRE_CERO
- Dividir entre cero (con
/,div,modo%) no tiene resultado. Revisa el divisor antes de dividir. - ÍNDICE_FUERA_DE_RANGO
- Las posiciones van de 0 a
longitud - 1(o de -1 a-longituddesde el final). Un error clásico es usarlongitud(lista)como índice: el último eslongitud(lista) - 1. - ÍNDICE_INVÁLIDO
- La posición de una lista o texto tiene que ser un número entero. Las claves de texto son para diccionarios.
- ÍNDICE_NO_SOPORTADO
[ ]funciona con listas, textos y diccionarios, y.camposolo con diccionarios. Revisa qué valor tiene la variable.- LISTA_MODIFICADA_AL_RECORRER
- La lista cambió de tamaño mientras
para_cadala recorría, así que no queda claro qué elemento sigue. Cambiar elementos está bien; para agregar o quitar, recorre una copia o junta los cambios en otra lista. - LISTA_VACÍA
- El procedimiento necesita al menos un elemento y la lista está vacía. Revisa antes con
longitud(lista) > 0. - MIEMBRO_DE_SOLO_LECTURA
- Desde fuera de un dominio solo se pueden cambiar sus miembros declarados con
variable. Sus constantes, sus procedimientos y los dominios que contiene quedan fijos, para quecalculadora.sumasiempre sea el mismo procedimiento. - MIEMBRO_INEXISTENTE
- El dominio no tiene un miembro con ese nombre. Puede estar mal escrito; los miembros se declaran dentro de las llaves del dominio y desde fuera no se pueden agregar.
- MOCHILA_VACÍA
- El robot intentó dejar un zumbador sin tener ninguno. Pregunta antes con
tengo_zumbadores(). - NO_ES_NÚMERO
- Se esperaba un número y el texto no lo es, como
"doce"o"3,5". Los decimales se escriben con punto:"3.5". - NO_ES_PROCEDIMIENTO
- Se intentó llamar con
( )a algo que no es un procedimiento, como un número o una lista. Revisa que no estés usando una variable con el mismo nombre que el procedimiento. - NOMBRE_DESCONOCIDO
- No hay ninguna variable ni procedimiento con ese nombre a la vista. Puede estar mal escrito, declararse más abajo, o haberse declarado dentro de un bloque que ya terminó.
- NOMBRE_RESERVADO_POR_BIBLIOTECA
- Ese nombre es de la biblioteca de Codexivo y no se le puede asignar un valor. Si quieres una variable propia con ese nombre, declárala con
variable; mientras exista, oculta al de la biblioteca. - OPERANDO_NO_LÓGICO
y,oynounen valoresverdaderoofalso. Para preguntar algo sobre un número o un texto, compáralo primero:x > 0 y nombre != "".- PARA_CADA_INVÁLIDO
para_cadarecorre listas, textos y diccionarios. Para contar se recorre un rango (para_cada i en rango(1, 10)), y la forma con dos variables (para_cada clave, valor en d) es solo para diccionarios.- PARA_LÍMITE_INVÁLIDO
- En
para i desde a hasta b con_paso p, el inicio, el final y el paso tienen que ser números. Si vienen deleer(), conviértelos connúmero(…)o usaleer_número(). - PARA_PASO_CERO
- Con
con_paso 0, la variable nunca cambiaría y elparano llegaría al final. Usa un paso positivo para contar hacia arriba o uno negativo para contar hacia abajo. - PARA_SENTIDO_CONTRARIO
- El paso va en el sentido contrario al que hay que recorrer: por ejemplo,
para i desde 10 hasta 1sin paso cuenta hacia arriba y nunca llegaría al 1. Codexivo no lo invierte solo ni hace cero vueltas en silencio: para contar hacia atrás escribecon_paso -1. - PILA_VACÍA
- Se intentó sacar o consultar el tope de una pila que no tiene nada. Revisa antes con
longitud(pila) > 0. - POTENCIA_INVÁLIDA
- Un número negativo elevado a un exponente con decimales, como
(-8) ^ 0.5, no tiene un resultado real. Con exponentes enteros sí funciona. - RAÍZ_DE_NEGATIVO
- La raíz cuadrada solo existe para números de 0 en adelante.
- RANGO_DEMASIADO_GRANDE
- El
rangotendría millones de números, lo que casi siempre es un error en el inicio, el final o el paso. Revísalos. - RANGO_INVÁLIDO
- En
subtextoyrebanar, el inicio no puede estar después del fin. El fin no se incluye:subtexto("hola", 1, 3)es"ol". - RANGO_PASO_CERO
- Con paso 0,
rangonunca llegaría al final. Usa un paso positivo para contar hacia arriba o uno negativo para contar hacia abajo. - REPETICIONES_INVÁLIDAS
repetir n vecesnecesita quensea un número entero, 0 o más. Con un texto, conviértelo connúmero(…); con decimales, redondéalo.- ROBOT_APAGADO
- Después de
apagar()el robot ya no hace ninguna acción.apagar()va al final del programa. - SEPARADOR_VACÍO
dividiryreemplazarnecesitan un texto que buscar que no esté vacío. Para separar letra por letra, usacaracteres(t).- SIN_ENTRADA
leer_número()no encontró más datos de entrada. Revisa cuántos datos espera el programa y cuántos se le dieron.- SIN_ZUMBADORES
- El robot intentó recoger un zumbador donde no hay. Pregunta antes con
hay_zumbador(). - TEXTO_INMUTABLE
- Los textos no se cambian letra por letra:
t[0] = "H"es un error. Se construye un texto nuevo, por ejemplo uniendo partes con+o conreemplazar. - TIPO_DE_ARGUMENTO
- Un procedimiento de la biblioteca recibió un valor de un tipo que no acepta, como un texto donde esperaba un número. El mensaje dice qué esperaba y qué recibió.
- TIPO_INVÁLIDO
- El operador no funciona con esos tipos, como
-entre dos textos onocon un número. Revisa qué valor tiene cada lado. - TIPOS_MEZCLADOS
+suma dos números o une dos textos, pero no mezcla:"Total: " + 5es un error. Convierte el número contexto(5), o imprime los dos por separado:imprimir("Total:", 5).- VARIABLE_DE_PARA
- La variable de
para i desde … hasta …avanza sola en cada vuelta, así que no se puede cambiar dentro del bucle. Si necesitas otro valor, guárdalo en una variable nueva; si necesitas controlar el avance a mano, usamientras. - VARIABLE_NO_DECLARADA
- Se le asignó un valor a una variable que no existe. La primera vez se declara con
variable x = …; después se cambia conx = …. - VARIABLE_REPETIDA
- La variable ya existe en este bloque. Para cambiar su valor se escribe
x = …, sinvariable. Un bloque interno sí puede declarar otra con el mismo nombre.
De límite: el programa pasó un límite de seguridad
- DEMASIADA_SALIDA
- El programa imprimió demasiado texto, casi siempre por un
imprimirdentro de un bucle que no termina. - DEMASIADAS_LLAMADAS
- Hay demasiadas llamadas anidadas, casi siempre por una recursión sin caso base: el procedimiento se llama a sí mismo sin una condición que lo detenga.
- DEMASIADAS_OPERACIONES
- El programa hizo más operaciones de las permitidas. Casi siempre es un bucle cuya condición nunca cambia; revisa que algo dentro del bucle lo acerque al final.