3.4. Conozca sus mensajes de error
Muchos problemas en su programa conducirán a un mensaje de error. Por ejemplo, mientras escribía y probaba este capítulo del libro, escribí la siguiente versión del programa de ejemplo en la sección anterior.
>>current_time_str = input("What is the current time (in hours 0-23)?")
>>wait_time_str = input("How many hours do you want to wait")
>>current_time_int = int(current_time_str)
>>wait_time_int = int(wait_time_int)
>>final_time_int = current_time_int + wait_time_int
>>print(final_time_int)
¿Puedes ver lo que está mal, solo mirando el código? Tal vez, tal vez no. Nuestro cerebro tiende a ver lo que creemos que está ahí, por lo que a veces es muy difícil encontrar el problema con solo mirar el código. ¡Especialmente cuando es nuestro propio código y estamos seguros de que hemos hecho todo bien!
Vamos a intentar el programa nuevamente, pero esta vez en un código activado:
>>current_time_str = input("What is the current time (in hours 0-23)?")
>>wait_time_str = input("How many hours do you want to wait")
>>current_time_int = int(current_time_str)
>>wait_time_int = int(wait_time_int)
>>final_time_int = current_time_int + wait_time_int
>>print(final_time_int)
Error
NameError: el nombre 'wait_time_int' no está definido en la línea 5
Descripción
Un error de nombre casi siempre significa que ha usado una variable antes de que tenga un valor. A menudo, esto puede ser un error tipográfico simple, así que verifique la ortografía cuidadosamente.
Para arreglar
Verifique el lado derecho de las declaraciones de asignación y sus llamadas de función, este es el lugar más probable para encontrar un nombre de nombre.
¡Ajá! Ahora tenemos un mensaje de error que podría ser útil. El error del nombre nos dice que wait_time_int
no está definido. También nos dice que el error está en la línea 5. Esa es realmente útil. Ahora mira la línea cinco y verás que wait_time_int
se usa tanto en el lado izquierdo como en el lado derecho de la declaración de asignación.
Nota
Las descripciones de errores que ve en Activecode pueden ser diferentes (¡y más comprensibles!) Que en un regular Intérprete de Python. El intérprete en Activecode es limitado de muchas maneras, pero está destinado a principiantes, incluyendo la redacción elegida para describir errores.
¿Cuál de los siguientes explica por qué wait_time_int = int(wait_time_int)
¿Es un error?
Actividad: 3.4.2 Opcion multiple
R! B.
En la escritura y el uso de este libro en los últimos años, hemos recopilado muchas estadísticas sobre los programas en este libro. Aquí hay algunas estadísticas sobre los mensajes de error para el ejercicio que hemos estado viendo.
Mensaje |
Número |
Por ciento |
---|---|---|
PARSEERROR: |
4999 |
54.74% |
Typinguror: |
1305 |
14.29% |
NameError: |
1009 |
11.05% |
ValueError: |
893 |
9.78% |
Urierror: |
334 |
3.66% |
Tokenerror: |
244 |
2.67% |
SyntaxError: |
227 |
2.49% |
TimeLimitError: |
44 |
0.48% |
Terror de sangría: |
28 |
0.31% |
AtributeError: |
27 |
0.30% |
Importre: |
16 |
0.18% |
IndexError: |
6 |
0.07% |
Casi el 90% de los mensajes de error encontrados para este problema son PaSeRor, TypeError, NameError o ValueError. Veremos estos errores en tres etapas:
Primero definiremos qué significan estos cuatro mensajes de error.
Luego, veremos algunos ejemplos que hacen que ocurran estos errores.
Finalmente, buscaremos formas de ayudar a descubrir la causa raíz de estos mensajes.
3.4.1. ParseError
Los errores de análisis ocurren cuando comete un error en la sintaxis de su programa. Los errores de sintaxis son como hacer errores gramaticales por escrito. Si no usa períodos y comas en su escritura, entonces está dificultando que otros lectores descubran lo que está tratando de decir. Del mismo modo, Python tiene ciertas reglas gramaticales que deben seguirse o Python no puede entender lo que está tratando de decir.
Por lo general, los analizadores se remontan a los personajes de puntuación faltantes, como paréntesis, comillas o comas. Recuerde que en las comas de Python se utilizan para separar los parámetros de las funciones. Las paréntesis deben estar equilibradas, o Python piensa que está tratando de incluir todo lo que sigue como un parámetro para alguna función.
Aquí hay un par de ejemplos de errores de análisis en el programa de ejemplo que hemos estado usando. Vea si puede averiguar qué los causó.
Busque y corrija el error en el siguiente código.
>>current_time_str = input("What is the current time (in hours 0-23)?")
>>wait_time_str = input("How many hours do you want to wait"
>>current_time_int = int(current_time_str)
>>wait_time_int = int(wait_time_str)
>>final_time_int = current_time_int + wait_time_int
>>print(final_time_int)
PPI: ERROR: el input de la linea 2 no esta cerrado.
Entrenador de código
Línea2: '(' nunca fue cerrado
Wait_time_str = input ("¿Cuántas horas quieres esperar"
^
Error
SyntaxError: mala entrada en la línea 4
Descripción
Este mensaje indica que Python no puede descubrir la sintaxis de una declaración particular. Algunos ejemplos están asignando a una llamada literal o de función
Para arreglar
Verifique sus declaraciones de asignación y asegúrese de que el lado izquierdo de la tarea sea una variable, no una función literal o una función.
Encontrar pistas ¿Cómo
puedes ayudarte a encontrar estos problemas? Un truco que puede ser muy
valioso en esta situación es simplemente comenzar comentando el número
de línea que se marcó con el error. Si comenta la línea cuatro, el
mensaje de error ahora cambia para señalar a la línea 5. Ahora te
preguntas, ¿soy realmente tan malo que tengo dos líneas seguidas que
tienen errores en ellos? Tal vez, así que llevado al extremo, podría
comentar todas las líneas restantes del programa. Ahora el mensaje de
error cambia a TokenError: EOF in multi-line statement
Esta es una forma muy técnica de decir que Python llegó al final del
archivo (EOF) mientras todavía estaba buscando algo. En este caso, un
paréntesis derecho.
Busque y corrija el error en el siguiente código.
current_time_str = input("What is the "current time" (in hours 0-23)?")
wait_time_str = input("How many hours do you want to wait")
current_time_int = int(current_time_str)
wait_time_int = int(wait_time_str)
final_time_int = current_time_int + wait_time_int
print(final_time_int)
Actividad: 3.4.1.2 Activecode (DB_EX3_7)
Entrenador de código
Línea1: Sintaxis no válida. ¿Quizás olvidaste una coma?
current_time_str = input ("¿Cuál es la" hora actual "(en las horas 0-23)?")
^
Error
SyntaxError: mala entrada en la línea 1
Descripción
Este mensaje indica que Python no puede descubrir la sintaxis de una declaración particular. Algunos ejemplos están asignando a una llamada literal o de función
Para arreglar
Verifique sus declaraciones de asignación y asegúrese de que el lado izquierdo de la tarea sea una variable, no una función literal o una función.
Encontrar pistas Si
sigue el mismo consejo que para el último problema, comente la línea
uno, inmediatamente recibirá un mensaje de error diferente. Aquí es
donde debes tener mucho cuidado y no entrar en pánico. El mensaje de
error que recibe ahora es: NameError: name 'current_time_str' is not defined on line 4
.
Es posible que esté muy tentado a pensar que esto está de alguna manera
relacionado con el problema anterior e inmediatamente concluir que hay
algo mal con el nombre de la variable. current_time_str
Pero si reflexiona por un minuto, lo verá al comentar una línea, ha
causado un error nuevo y no relacionado. Es decir, has comentado la
creación del nombre current_time_str
. Entonces, por supuesto, cuando quieras convertirlo en un int
Obtendrá el NameError. Sí, esto puede ser confuso, pero será mucho más
fácil con la experiencia. También es importante mantener la calma y
evaluar cada nueva pista con cuidado para que no pierda el tiempo
persiguiendo problemas que realmente no están allí.
Línea de incommento 1 y
vuelves al analizador. Otra pista es eliminar una posible fuente de
error. En lugar de comentar toda la línea, podría intentar asignar current_time_str
a un valor constante. Por ejemplo, puede hacer que la línea se vea así: current_time_str = "10" #input("What is the "current time" (in hours 0-23)?")
. Ahora has asignado current_time_str
a la cadena 10 y comentó la declaración de entrada. ¡Y ahora el
programa funciona! Entonces, concluye que el problema debe tener algo
que ver con la función de entrada.
3.4.2. TypeError
TypeErrors ocurre cuando intenta combinar dos objetos que no son compatibles. Por ejemplo, intenta agregar un entero y una cadena. Por lo general, los errores de tipo se pueden aislar a las líneas que utilizan operadores matemáticos, y generalmente el número de línea dado por el mensaje de error es una indicación precisa de la línea.
Aquí hay un ejemplo de un error de tipo creado por un alumno polaco. Vea si puede encontrar y corregir el error.
a = input('wpisz godzine')
x = input('wpisz liczbe godzin')
int(x)
int(a)
h = x // 24
s = x % 24
print (h, s)
a = a + s
print ('godzina teraz', a)
Actividad: 3.4.2.1 Activecode
Error
TypeError: tipos de operando no compatibles para //: 'str' e 'int' en la línea 5
Descripción
Los errores de tipo se producen con mayor frecuencia cuando una expresión intenta combinar dos objetos con tipos que no deben combinarse. Como levantar una cadena a un poder
Para arreglar
Para corregir un error de tipo, lo más probable es que deba rastrear su código y asegurarse de que las variables tengan los tipos que espera que tengan. Puede ser útil imprimir cada variable en el camino para asegurarse de que su valor es lo que cree que debería ser.
Encontrar pistas Una
cosa que puede ayudarlo en esta situación es imprimir los valores y los
tipos de las variables involucradas en la declaración que está causando
el error. Puede intentar agregar una declaración de impresión después
de la línea 4 print(x, type(x))
Verá que al menos hemos confirmado que X es de Type String. Ahora debe
comenzar a trabajar hacia atrás a través del programa. Debes
preguntarte, ¿dónde se usa X en el programa? X se usa en las líneas 2, 3
y, por supuesto, 5 y 6 (donde recibimos un error). Entonces, tal vez
mueva la declaración de impresión para que esté después de la línea 2 y
nuevamente después de 3. La línea 3 es donde espera que el valor de X se
cambie a un entero. ¿Podría la línea 4 estar cambiando misteriosamente X
a una cuerda? No es muy probable. Por lo tanto, el valor y el tipo de X
es justo lo que esperaría que sea después de la línea 2, pero no
después de la línea 3. Esto le ayuda a aislar el problema a la línea 3.
De hecho, si emplea una de nuestras técnicas anteriores de comentar la
línea 3, verá que esto no tiene impacto en el error, y es una gran pista
de que la línea 3 como se escribe actualmente es inútil.
3.4.3. NameError
Los errores de nombre casi siempre significan que ha usado una variable antes de que tenga un valor. A menudo, NameErrors simplemente es causado por errores tipográficos en su código. Pueden ser difíciles de detectar si no tienes un buen ojo para captar errores de ortografía. Otras veces puede simplemente recordar mal el nombre de una variable o incluso una función a la que desea llamar. Has visto un ejemplo de un NameError al comienzo de esta sección. Aquí hay otro. Vea si puede hacer que este programa se ejecute correctamente:
str_time = input("What time is it now?")
str_wait_time = input("What is the number of nours to wait?")
time = int(str_time)
wai_time = int(str_wait_time)
time_when_alarm_go_off = time + wait_time
print(time_when_alarm_go_off)
Actividad: 3.4.3.1 Activecode
Entrenador de código
Line6: Nombre indefinido 'Wait_time'
TIME_WREN_ALARM_GO_OFF = TIME + WAIT_TIME
^
Error
ValueError: Literal no válido para int () con base 10: '16: 57 'en la línea 3
Descripción
Un ValueError se produce con mayor frecuencia cuando pasa un parámetro a una función y la función espera un tipo y pasa otro.
Para arreglar
El mensaje de error le da una pista bastante buena sobre el nombre de la función, así como el valor que es incorrecto. Mire el mensaje de error de cerca y luego rastree la variable que contiene el valor problemático.
Encontrar pistas con errores de nombre Una de las mejores cosas que puede hacer es usar el editor o la función de búsqueda del navegador. Muy a menudo si busca la palabra exacta en el mensaje de error, una de las dos cosas sucederá:
La palabra que está buscando aparecerá solo una vez en su código, también es probable que esté en el lado derecho de una declaración de asignación, o como un parámetro para una función. Eso debería confirmar para usted que tiene un error tipográfico en alguna parte. Si el nombre en cuestión es lo que pensó que debería ser, entonces probablemente tenga un error tipográfico en el lado izquierdo de una declaración de asignación en una línea antes de que ocurra su mensaje de error. Comience a mirar hacia atrás en sus declaraciones de asignación. En algunos casos, es realmente agradable dejar todas las cadenas resaltadas de la función de búsqueda visible, ya que lo ayudarán a encontrar rápidamente una línea en la que podría haber esperado que su variable se resalte.
La segunda cosa que puede suceder es que mirará directamente una línea donde esperaba la búsqueda para encontrar la cadena en cuestión, pero no se resaltará. La mayoría de las veces será el error tipográfico allí mismo.
Aquí hay otro para que pruebes:
n = input("What time is it now (in hours)?")
n = imt(n)
m = input("How many hours do you want to wait?")
m = int(m)
q = m % 12
print("The time is now", q)
Actividad: 3.4.3.2 Activecode
Entrenador de código
Línea2: Nombre indefinido 'IMT'
n = imt (n)
^
Error
NameError: el nombre 'IMT' no está definido en la línea 2
Descripción
Un error de nombre casi siempre significa que ha usado una variable antes de que tenga un valor. A menudo, esto puede ser un error tipográfico simple, así que verifique la ortografía cuidadosamente.
Para arreglar
Verifique el lado derecho de las declaraciones de asignación y sus llamadas de función, este es el lugar más probable para encontrar un nombre de nombre.
Y un último bit de código para solucionar.
present_time = input("Enter the present timein hours:")
set_alarm = input("Set the hours for alarm:")
int (present_time, set_time, alarm_time)
alarm_time = present_time + set_alarm
print(alarm_time)
Actividad: 3.4.3.3 Activecode
Entrenador de código
Line3: Nombre indefinido 'set_time'
int (present_time, set_time, alarm_time)
^
Line3: Nombre indefinido 'ALARM_TIME'
int (present_time, set_time, alarm_time)
^
Error
NameError: el nombre 'set_time' no se define en la línea 3
Descripción
Un error de nombre casi siempre significa que ha usado una variable antes de que tenga un valor. A menudo, esto puede ser un error tipográfico simple, así que verifique la ortografía cuidadosamente.
Para arreglar
Verifique el lado derecho de las declaraciones de asignación y sus llamadas de función, este es el lugar más probable para encontrar un nombre de nombre.
3.4.4. ValueError
Los errores de valor ocurren cuando pasa un parámetro a una función y la función espera cierta limitaciones en los valores, y el valor aprobado no es compatible. Podemos ilustrar eso con este programa en particular de dos maneras diferentes.
current_time_str = input("What is the current time (in hours 0-23)?")
current_time_int = int(current_time_str)
wait_time_str = input("How many hours do you want to wait")
wait_time_int = int(wait_time_int)
final_time_int = current_time_int + wait_time_int
print(final_time_int)
Actividad: 3.4.4.1 Activecode
Entrenador de código
Line5: Nombre indefinido 'Wait_time_int'
Wait_time_int = int (wait_time_int)
^
Error
NameError: el nombre 'wait_time_int' no está definido en la línea 5
Descripción
Un error de nombre casi siempre significa que ha usado una variable antes de que tenga un valor. A menudo, esto puede ser un error tipográfico simple, así que verifique la ortografía cuidadosamente.
Para arreglar
Verifique el lado derecho de las declaraciones de asignación y sus llamadas de función, este es el lugar más probable para encontrar un nombre de nombre.
Ejecute el programa pero en
lugar de escribir cualquier cosa en el cuadro de diálogo, simplemente
haga clic en Aceptar. Debería ver el siguiente mensaje de error: ValueError: invalid literal for int() with base 10: '' on line: 4
Este error no es porque haya cometido un error en su programa. Aunque a
veces queremos verificar la entrada del usuario para asegurarnos de que
sea válida, pero aún no tenemos todas las herramientas que necesitamos
para eso. El error ocurre porque el usuario no nos dio algo que podamos
convertir a un entero, en su lugar le dimos una cadena vacía. Intente
ejecutar el programa nuevamente. Ahora esta vez ingrese "Diez" en lugar
del número 10. Obtendrá un mensaje de error similar.
ValueErrors no siempre es causado por el error de entrada del usuario, pero en este programa ese es el caso. Volveremos a ver ValueErrors nuevamente cuando llegamos a programas más complicados. Por ahora, vale la pena repetir que debe realizar un seguimiento de las restricciones necesarias para sus variables y comprender lo que su función está esperando. Puede hacer esto escribiendo comentarios en su código, o nombrando sus variables de una manera que le recuerde su forma adecuada.
No hay comentarios.:
Publicar un comentario