Categorías
Python

Profundizando en Django Migraciones

 

Tabla de Contenidos

  • ¿Qué es una retraza de Python?
  • ¿Cómo se lee una retraza Python? Python Rastreo OverviewSpecific Rastreo Tutorial
  • Python Rastreo general
  • específico Rastreo Tutorial
  • ¿Cuáles son algunas Los seguimientos común en Python? AttributeErrorImportErrorIndexErrorKeyErrorNameErrorSyntaxErrorTypeErrorValueError
  • AttributeError
  • ImportError
  • IndexError
  • KeyError
  • NameError
  • SyntaxError
  • TypeError
  • ValueError
  • ¿Cómo hacer un registro de una retraza?
  • Conclusión
  • Python Rastreo general
  • específico Rastreo Tutorial
  • AttributeError
  • ImportError
  • IndexError
  • KeyError
  • NameError
  • SyntaxError
  • TypeError
  • ValueError

Python imprime un rastreo cuando se produce una excepción en el código. La salida de rastreo puede ser un poco abrumador si usted está viendo por primera vez o si no sabe lo que está diciendo. Pero el Python rastreo tiene una gran cantidad de información que puede ayudar a diagnosticar y solucionar el motivo de la excepción haber sido criado en su código. La comprensión de la información que una pitón rastreo ofrece es vital para convertirse en un mejor programador de Python.

Al final de este tutorial, usted será capaz de:

  • dar sentido a la siguiente rastreo se ve
  • reconocer algunas de las más comunes tracebacks
  • registrar un rastreo con éxito sin dejar de manejar la excepción
  • Bono

gratuito: Haga clic aquí para obtener nuestro libre Hoja de trucos Python que le muestra los conceptos básicos de Python 3, como trabajar con tipos de datos, diccionarios, listas y funciones de Python.

¿Qué es una retraza de Python?

Un rastreo es un informe que contiene las llamadas a funciones realizadas en su código en un punto específico. Los seguimientos son conocidos por muchos nombres, incluyendo Seguimiento de la pila , de vuelta traza pila, traza , y tal vez otros. En Python, el término utilizado es rastreo .

Cuando los resultados de los programas en una excepción, Python imprimirá el rastreo actual para ayudarle a saber lo que salió mal. A continuación se muestra un ejemplo para ilustrar esta situación:

# example.py
def greet(someone):
print('Hello, ' + someon)

greet('Chad')

Aquí, greet () se llama con el parámetro de alguien. Sin embargo, en greet (), que nombre de la variable no se utiliza. En lugar de ello, se ha escrito incorrectamente como someon en la convocatoria de impresión ().

Nota: Este tutorial asume que entiende excepciones Python. Si no está familiarizado o simplemente desea una actualización, entonces usted debe comprobar fuera de excepciones Python: Una introducción.

Cuando se ejecuta este programa, obtendrá el siguiente rastreo:

$ python example.py
Traceback (most recent call last):
File "/patho/example.py", line 4, in
greet('Chad')
File "/patho/example.py", line 2, in greet
print('Hello, ' + someon)
NameError: name 'someon' is not defined

Esta salida de rastreo tiene toda la información que necesita para diagnosticar el problema. La última línea de la salida de rastreo le indica qué tipo de excepción fue levantado junto con alguna información relevante sobre dicha excepción. Las líneas anteriores del punto de rastreo a cabo el código que resultó en la excepción siendo criados.

En el rastreo anterior, la excepción fue un NameError, lo que significa que hay una referencia a un nombre (variable, función, clase) que no ha sido definida. En este caso, el nombre hace referencia es someon.

La línea final en este caso tiene suficiente información para ayudar a solucionar el problema. Buscar el código de la someon nombre, que es una falta de ortografía, que se apuntan en la dirección correcta. A menudo, sin embargo, su código es mucho más complicado.

¿Cómo se lee una retraza de Python?

El rastreo de Python contiene una gran cantidad de información útil cuando se está tratando de determinar la razón de una excepción que se levantó en el código. En esta sección, podrá caminar a través de diferentes rastreos con el fin de comprender los diferentes bits de información contenida en un rastreo.

Python Rastreo general

Hay varias secciones a cada rastreo de Python que son importantes. El diagrama a continuación destaca las diversas partes:

En Python, lo mejor es leer el rastreo desde la parte inferior hacia arriba: cuadro

Azul: la última línea del rastreo es la línea del mensaje de error. Contiene el nombre de la excepción que se planteó.

verde caja: Después de que el nombre de la excepción es el mensaje de error. Este mensaje suele contener información útil para comprender la razón de que se produce la excepción. Caja

Amarillo: Más arriba en el rastreo son las diversas llamadas a funciones en movimiento de abajo hacia arriba, más recientes al menos reciente. Estas llamadas están representadas por medio de anotaciones de dos líneas para cada llamada. La primera línea de cada llamada contiene información como el nombre del archivo, número de línea, y el nombre del módulo, especificando todos los que el código se puede encontrar. subrayado

Rojo: La segunda línea para estas llamadas contiene el código real que se ha ejecutado.

Hay algunas diferencias entre la salida de rastreo cuando se está ejecutando el código en la línea de comandos y ejecutar código en el REPL. A continuación se muestra el mismo código de la sección anterior ejecutado en un REPL y la salida de rastreo resultante:

>>> def greet(someone):
... print('Hello, ' + someon)
...
>>> greet('Chad')
Traceback (most recent call last):
File "", line 1, in
File "", line 2, in greet
NameError: name 'someon' is not defined

en cuenta que en lugar de nombres de archivo, que se obtiene ««. Esto tiene sentido ya que ha escrito el código a través de la entrada estándar. Además, las líneas de código ejecutada no se muestran en el rastreo.

Nota : Si está acostumbrado a ver trazas de la pila en otros lenguajes de programación, a continuación, usted notará una gran diferencia en la forma en apariencia una pitón de rastreo en comparación. La mayoría de los otros lenguajes de impresión la excepción en la parte superior y luego van de arriba a abajo, las llamadas más recientes a menos recientes.

Ya se ha dicho, pero sólo para reiterar, una retraza de Python se debe leer de abajo hacia arriba. Esto es muy útil ya que el rastreo se imprime y su terminal (o donde sea que usted está leyendo el rastreo) por lo general termina en la parte inferior de la salida, que le da el lugar perfecto para empezar a leer el rastreo.

específico Rastreo Tutorial

Pasando por parte de la producción específica de rastreo le ayudará a comprender mejor y ver qué información del rastreo le dará.

El código siguiente se utiliza en los ejemplos siguientes para ilustrar la información de rastreo de un pitón le da:

# greetings.py
def who_to_greet(person):
return person if person else input('Greet who? ')

def greet(someone, greeting='Hello'):
print(greeting + ', ' + who_to_greet(someone))

def greet_many(people):
for person in people:
try:
greet(person)
except Exception:
print('hi, ' + person)

Aquí, who_to_greet () toma un valor, persona, y, o bien lo devuelve o solicita un valor para volver en su lugar.

Entonces, greet () toma un nombre para ser recibido, alguien, y un valor de saludo opcional y llamadas imprimir (). who_to_greet () también es llamada con el valor que alguien se ha pasado.

Por último, greet_many () itera sobre la lista de las personas y saludar llamada (). Si hay una excepción planteada por llamar a saludar (), entonces un simple saludo de copia de seguridad se imprime.

Este código no tiene virus que darían lugar a una excepción siendo levantado el tiempo que se proporciona la entrada derecha.

si se agrega una llamada a saludar () a la parte inferior de greetings.py y especificar un argumento de palabra clave que no está a la espera (por ejemplo, saludar ( ‘Chad’, greting = ‘Yo’)), entonces usted obtener la siguiente rastreo:

$ python example.py
Traceback (most recent call last):
File "/patho/greetings.py", line 19, in
greet('Chad', greting='Yo')
TypeError: greet() got an unexpected keyword argument 'greting'

una vez más, con un rastreo de Python, lo mejor es trabajar hacia atrás, moviéndose hasta la salida. Comenzando en la línea final de la traza, se puede ver que la excepción fue un TypeError. Los mensajes que siguen el tipo de excepción, todo tras los dos puntos, que dan una gran información. Te dice que saludar () se llama con un argumento de palabra clave que no esperaba. El nombre de argumento desconoce también se da a usted: greting.

Moverse hacia arriba, se puede ver la línea que dio lugar a la excepción. En este caso, es el saludo () llamada que hemos añadido a la parte inferior de greetings.py.

La siguiente línea hasta le da la ruta al archivo donde se encuentra el código, el número de línea de ese archivo en el que el código se puede encontrar, y qué modulo que se encuentra. En este caso, ya que nuestro código no está usando cualquier otro módulos de Python, que acabamos de ver aquí, lo que significa que esta es la imagen que está siendo ejecutado.

Con un archivo diferente y entrada diferente, se puede ver el rastreo de verdad que apunta en la dirección correcta para encontrar el problema. Si está siguiendo a lo largo, quitar la llamada saludar con errores () desde la parte inferior de greetings.py y agregue el siguiente archivo en el directorio:

# example.py
from greetings import greet

greet(1)

Aquí ha configurado otro archivo de Python que está importando el módulo anterior, saludos. py, y el uso de greet () de ella. Esto es lo que ocurre si se ejecuta ahora example.py:

$ python example.py
Traceback (most recent call last):
File "/patho/example.py", line 3, in
greet(1)
File "/patho/greetings.py", line 5, in greet
print(greeting + ', ' + who_to_greet(someone))
TypeError: must be str, not int

La excepción planteada en este caso es un TypeError de nuevo, pero esta vez el mensaje es un poco menos útil. Se da a conocer que en alguna parte del código que estaba esperando para trabajar con una cadena, pero se le dio un número entero.

Moverse hacia arriba, se ve la línea de código que se ejecuta. A continuación, el archivo y el número de línea del código. Esta vez, sin embargo, en lugar de , obtenemos el nombre de la función que se estaba ejecutando, greet ().

de pasar a la siguiente línea de código ejecutada, vemos nuestra problemática greet () pasando llamada en un número entero.

A veces, después se produce una excepción, otro poco de capturas de código de excepción y que también da lugar a una excepción. En estas situaciones, Python da salida a todos los rastreos de excepción en el orden en que fueron recibidos, una vez más, que termina en el rastreo más reciente de excepción aumento.

Dado que esto puede ser un poco confuso, he aquí un ejemplo. Añadir una llamada a greet_many () a la parte inferior de greetings.py:

# greetings.py
...
greet_many(['Chad', 'Dan', 1])

Esto debe resultar en la impresión de saludo a las tres personas. Sin embargo, si ejecuta este código, verá un ejemplo de las múltiples rastreos se emiten:

$ python greetings.py
Hello, Chad
Hello, Dan
Traceback (most recent call last):
File "greetings.py", line 10, in greet_many
greet(person)
File "greetings.py", line 5, in greet
print(greeting + ', ' + who_to_greet(someone))
TypeError: must be str, not int

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "greetings.py", line 14, in
greet_many(['Chad', 'Dan', 1])
File "greetings.py", line 12, in greet_many
print('hi, ' + person)
TypeError: must be str, not int

Aviso la línea resaltada empezando por Durante la manipulación en la salida anterior. Entre todos los rastreos, verá esta línea. Su mensaje es muy claro, mientras que el código estaba tratando de manejar la excepción anterior, se planteó otra excepción.

Nota : función de mostrar los rastreos se añadieron en Python 3. En Python 2 las excepciones anteriores de Python, sólo obtendrá el último rastreo de excepción.

Has visto la excepción previa antes, cuando llamó greet () con un entero. Puesto que hemos añadido un 1 a la lista de personas para saludar, podemos esperar el mismo resultado. Sin embargo, la función de greet_many () envuelve la llamada greet () en un try y except bloque. Sólo en caso de saludar () da lugar a una excepción siendo criados, greet_many () quiere imprimir un saludo predeterminado.

La parte relevante de greetings.py se repite aquí:

def greet_many(people):
for person in people:
try:
greet(person)
except Exception:
print('hi, ' + person)

Así que cuando salude () da como resultado la TypeError debido a la entrada de enteros mal, greet_many () maneja dicha excepción y los intentos de imprimir un simple saludo. Aquí el código termina dando lugar a otro, de forma similar, una excepción. Todavía está intentando añadir una cadena y un entero.

Al ver toda la salida de rastreo puede ayudar a ver lo que podría ser la causa real de una excepción. A veces, cuando se ve la última excepción planteada, y su rastreo resultante, todavía no puede ver lo que está mal. En esos casos, se mueve hasta las excepciones anteriores por lo general le da una mejor idea de la causa raíz.

¿Cuáles son algunas Los seguimientos común en Python?

Conociendo cómo leer un rastreo de Python cuando el programa genera una excepción puede ser muy útil cuando se está programando, pero sabiendo algunos de los más comunes los rastreos puede también acelerar el proceso.

Aquí hay algunas excepciones comunes se puedan encontrar, las razones que quedan planteadas y lo que significan, y la información se puede encontrar en sus rastreos.

AttributeError

El AttributeError se produce cuando se intenta acceder a un atributo de un objeto que no tiene ese atributo definido. La documentación Python define cuando se eleva esta excepción:

lanza cuando falla una referencia atributo o asignación. (Fuente)

He aquí un ejemplo de la AttributeError ser criado:

>>> an_int = 1
>>> an_int.an_attribute
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'int' object has no attribute 'an_attribute'

La línea de mensajes de error para un AttributeError le indica que el tipo de objeto específico, int en este caso, no tiene el atributo visitada, an_attribute en este caso. Al ver el AttributeError en la línea del mensaje de error puede ayudar a identificar rápidamente qué atributo que ha intentado acceder y dónde ir para solucionarlo.

mayoría de las veces, conseguir esta excepción indica que es probable que esté trabajando con un objeto que no es del tipo que se esperaba:

>>> a_list = (1, 2)
>>> a_list.append(3)
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'tuple' object has no attribute 'append'

En el ejemplo anterior, usted podría estar esperando una_lista estar lista tipo, que tiene un método llamado .Append (). Cuando recibe la excepción AttributeError y ver que se planteó cuando se está intentando llamar .Append (), que te dice que es probable que no se trata del tipo de objeto que se esperaba.

A menudo, esto sucede cuando usted está esperando un objeto que se devuelve desde una llamada a la función o método que ser de un tipo específico, y se termina con un objeto de tipo Ninguno. En este caso, la línea de mensajes de error leerá, AttributeError: objeto ‘NoneType’ no tiene atributo ‘append’.

ImportError

El ImportError se eleva cuando algo va mal con una declaración de importación. Usted obtendrá esta excepción, o su subclase ModuleNotFoundError, si el módulo que está intentando importar que no se encuentra o si intenta importar algo de un módulo que no existe en el módulo. La documentación de Python define cuando se planteó esta excepción:

lanza cuando la declaración de importación tiene problemas tratando de cargar un módulo. También levantado cuando el ‘de la lista’ desde … importación tiene un nombre que no se puede encontrar. (Fuente)

He aquí un ejemplo de la ImportError y ModuleNotFoundError ser criado:

>>> import asdf
Traceback (most recent call last):
File "", line 1, in
ModuleNotFoundError: No module named 'asdf'
>>> from collections import asdf
Traceback (most recent call last):
File "", line 1, in
ImportError: cannot import name 'asdf'

En el ejemplo anterior, se puede ver que el intento de importar un módulo que no existe, asdf, resultados en el ModuleNotFoundError. Cuando se trata de algo de importación que no existe, asdf, desde un módulo que hace existe, colecciones, esto resulta en un ImportError. Las líneas de mensaje de error en la parte inferior de los rastreos que el que algo no haya podido importarse dicen, asdf en ambos casos.

IndexError

El IndexError se eleva cuando se intenta recuperar un índice a partir de una secuencia, como una lista o una tupla, y el índice no se encuentra en la secuencia. La documentación Python define cuando se eleva esta excepción:

lanza cuando un subíndice secuencia está fuera de rango. (Fuente)

Aquí hay un ejemplo que plantea la IndexError:

>>> a_list = ['a', 'b']
>>> a_list[3]
Traceback (most recent call last):
File "", line 1, in
IndexError: list index out of range

La línea de mensajes de error para un IndexError no le da una gran información. Se puede ver que tiene una secuencia de referencia que está fuera de rango y lo que el tipo de la secuencia es, una lista en este caso. Esa información, junto con el resto del rastreo, suele ser suficiente para ayudarle a identificar rápidamente cómo solucionar el problema.

KeyError

similares a la IndexError, la KeyError se produce cuando se intenta acceder a una clave que no está en el mapeo, normalmente una dict. Piense en esto como la IndexError pero para los diccionarios. El distribuidor determina documentación de Python cuando se levanta esta excepción:

elevada cuando una asignación de teclas (diccionario) no se encuentra en el conjunto de claves existentes. (Fuente)

He aquí un ejemplo de la KeyError ser criado:

>>> a_dict['b']
Traceback (most recent call last):
File "", line 1, in
KeyError: 'b'

La línea de mensajes de error para un KeyError le da la llave que no se pudo encontrar. Esto no es mucho para seguir adelante, pero, en combinación con el resto del rastreo, suele ser suficiente para solucionar el problema.

Para una mirada en profundidad a KeyError, echar un vistazo a excepciones Python KeyError y forma de abordarlos.

NameError

El NameError se eleva cuando se ha referenciado una variable, módulo, clase, función o algún otro nombre que no ha sido definido en el código. El distribuidor determina documentación de Python cuando se levanta esta excepción:

elevada cuando no se encuentra un nombre local o global. (Fuente)

En el código siguiente, greet () toma una persona parámetro. Pero en la propia función, que el parámetro ha sido mal escrito a persn:

>>> def greet(person):
... print(f'Hello, {persn}')
>>> greet('World')
Traceback (most recent call last):
File "", line 1, in
File "", line 2, in greet
NameError: name 'persn' is not defined

La línea de mensajes de error del rastreo NameError le da el nombre que falta. En el ejemplo anterior, es una variable mal escrita o parámetro a la función que se aprobó en

Un NameError también se incrementará si es el parámetro que están mal escritas:.

>>> def greet(persn):
... print(f'Hello, {person}')
>>> greet('World')
Traceback (most recent call last):
File "", line 1, in
File "", line 2, in greet
NameError: name 'person' is not defined

Aquí, podría parecer como si usted ha no ha hecho nada incorrecto. La última línea que se ejecutó y se hace referencia en el rastreo se ve bien. Si usted se encuentra en esta situación, entonces lo que hay que hacer es mirar a través de su código para el que se utiliza la variable persona y definido. Aquí puede ver rápidamente que el nombre del parámetro está mal escrito.

SyntaxError

El SyntaxError se eleva cuando se tiene la sintaxis de Python incorrecta en el código. Los define documentación de Python cuando se eleva esta excepción:

elevada cuando el analizador encuentra un error de sintaxis. (Fuente)

A continuación, el problema es la falta de colon que debe estar al final de la línea de definición de función. En el REPL Python, este error de sintaxis se eleva de inmediato después de oprimir la tecla Enter:

>>> def greet(person)
File "", line 1
def greet(person)
^
SyntaxError: invalid syntax

La línea de mensajes de error del SyntaxError sólo le dice que había un problema con la sintaxis del código. Mirando en las líneas anteriores le da la línea con el problema y por lo general un ^ (intercalación) apuntando hacia el lugar problema. Aquí, el colon no se encuentra en la declaración def de la función.

Además, con los rastreos SyntaxError, la primera línea regular de Rastreo (llamada más reciente pasado): no se encuentra. Esto se debe a la SyntaxError se eleva cuando los intentos de Python para analizar su código, y no están realmente en ejecución las líneas.

TypeError

El TypeError se eleva cuando sus intentos de código para hacer algo con un objeto que no se puede hacer eso, como se trata de añadir una cadena a un entero o llamando len () sobre un objeto en su longitud ISN’ t definido. La documentación Python define cuando se eleva esta excepción:

lanza cuando se aplica una operación o función a un objeto de tipo apropiado. (Fuente)

A continuación se presentan varios ejemplos de la TypeError siendo técnicos:

>>> 1 + '1'
Traceback (most recent call last):
File "", line 1, in
TypeError: unsupported operand type(s) for +: 'int' and 'str'
>>> '1' + 1
Traceback (most recent call last):
File "", line 1, in
TypeError: must be str, not int
>>> len(1)
Traceback (most recent call last):
File "", line 1, in
TypeError: object of type 'int' has no len()

Todos los ejemplos anteriores de la crianza de un resultados TypeError en una línea de mensaje de error con diferentes mensajes. Cada uno de ellos hace un muy buen trabajo de informarle de lo que está mal.

El primero dos ejemplos intente añadir palabras y enteros juntos. Sin embargo, son sutilmente diferentes:

  • La primera está tratando de añadir un str a un int.
  • La segunda está tratando de añadir un int a un str.

Las líneas de mensaje de error reflejan estas diferencias.

el último ejemplo intenta llamar a len () en un int. La línea de mensaje de error que dice que no se puede hacer eso con un int.

ValueError

El ValueError se eleva cuando el valor del objeto no es la correcta. Se puede pensar en esto como una IndexError que se plantea debido a que el valor del índice no está en el rango de la secuencia, sólo el ValueError es para un caso más genérico. Los define documentación de Python cuando se eleva esta excepción:

elevada cuando una operación o función recibe un argumento que tiene el tipo correcto, pero un valor apropiado, y la situación no se describe por una excepción más precisa como IndexError. (Fuente)

Aquí hay dos ejemplos de ValueError siendo criados:

>>> a, b, c = [1, 2]
Traceback (most recent call last):
File "", line 1, in
ValueError: not enough values to unpack (expected 3, got 2)
>>> a, b = [1, 2, 3]
Traceback (most recent call last):
File "", line 1, in
ValueError: too many values to unpack (expected 2)

El ValueError línea de mensaje de error en estos ejemplos te dice exactamente cuál es el problema con los valores:

En el primer ejemplo, usted está tratando de descomprimir demasiados valores. La línea de mensajes de error incluso le dice que usted estaba esperando para descomprimir 3 valores, pero tiene 2 valores.

En el segundo ejemplo, el problema es que usted está recibiendo demasiados valores y no hay suficientes variables para desempaquetar los archivos en.

¿Cómo hacer un registro de una retraza?

Conseguir una excepción y sus resultantes medios de rastreo de Python que necesita para decidir qué hacer al respecto. Por lo general, la fijación de su código es el primer paso, pero a veces el problema es con la entrada inesperada o incorrecta. Aunque es bueno para proporcionar para aquellas situaciones en su código, a veces también tiene sentido al silencio u ocultar la excepción ingresando el rastreo y haciendo otra cosa.

Aquí hay un ejemplo más del mundo real de código que necesita para silenciar algunas trazas de retorno de Python. Este ejemplo utiliza la biblioteca de solicitudes. Usted puede encontrar más información al respecto en las peticiones de bibliotecas de Python (Guía):

# urlcaller.py
import sys
import requests

response = requests.get(sys.argv[1])

print(response.status_code, response.content)

Este código funciona bien. Al ejecutar esta secuencia de comandos, lo que le da una URL como un argumento de línea de comandos, se llamará la URL y luego imprimir el código de estado HTTP y el contenido de la respuesta. Incluso funciona si la respuesta era un estado de error HTTP:

$ python urlcaller.py https://httpbin.org/status/200
200 b''
$ python urlcaller.py https://httpbin.org/status/500
500 b''

Sin embargo, a veces la URL se muestra la secuencia de comandos para recuperar no existe, o el servidor host está caído. En esos casos, este script ahora lanzar una excepción no capturada ConnectionError e imprimir un rastreo:

$ python urlcaller.py http:/hisurlprobablydoesntexist.com
...
During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "urlcaller.py", line 5, in
response = requests.get(sys.argv[1])
File "/patho/requests/api.py", line 75, in get
return request('get', url, params=params, **kwargs)
File "/patho/requests/api.py", line 60, in request
return session.request(method=method, url=url, **kwargs)
File "/patho/requests/sessions.py", line 533, in request
resp = self.send(prep, **send_kwargs)
File "/patho/requests/sessions.py", line 646, in send
r = adapter.send(request, **kwargs)
File "/patho/requests/adapters.py", line 516, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='thisurlprobablydoesntexist.com', port=80): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known',))

El pitón de rastreo aquí puede ser muy largo con muchas otras excepciones se plantean y, finalmente, lo que resulta en la ConnectionError que son criados por las solicitudes de sí mismo. Si sube las excepciones finales de rastreo, se puede ver que el problema empezó todo en nuestro código con la línea 5 de urlcaller.py.

Si se coloca la línea en cuestión en un try y except bloque, agarrar la excepción adecuada permitirá que su guión a seguir trabajando con más entradas:

# urlcaller.py
...
try:
response = requests.get(sys.argv[1])
except requests.exceptions.ConnectionError:
print(-1, 'Connection Error')
else:
print(response.status_code, response.content)

El código anterior utiliza una cláusula else con el try y except bloque. Si no está familiarizado con esta característica de Python, a continuación, echa un vistazo a la sección sobre la cláusula de los demás en Python Excepciones: Una introducción.

Ahora cuando se ejecuta la secuencia de comandos con una dirección URL que se traducirá en una ConnectionError ser elevado, obtendrá un impreso -1 para el código de estado y el contenido Error de conexión:

$ python urlcaller.py http:/hisurlprobablydoesntexist.com
-1 Connection Error

Esto funciona muy bien. Sin embargo, en la mayoría de los sistemas reales, que no quiere simplemente silenciar la excepción y rastreo resultante, pero que desea registrar el rastreo. Registro de los rastreos le permite tener una mejor comprensión de lo que va mal en sus programas.

Nota: Para obtener más información acerca del sistema de registro de Python, echa un vistazo a Inicio de sesión en Python.

Puede registrar el rastreo en el guión importando el paquete de registro, conseguir un registrador, y llamando .exception () en ese registrador en la excepción porción del try y except bloque. Su guión final debería ser algo como el siguiente código:

# urlcaller.py
import logging
import sys
import requests

logger = logging.getLogger(__name__)

try:
response = requests.get(sys.argv[1])
except requests.exceptions.ConnectionError as e:
logger.exception()
print(-1, 'Connection Error')
else:
print(response.status_code, response.content)

Ahora cuando se ejecuta la secuencia de comandos para una dirección URL problemática, se imprimirá la espera -1 y Error de conexión, pero también registrará el rastreo:

$ python urlcaller.py http:/hisurlprobablydoesntexist.com
...
File "/patho/requests/adapters.py", line 516, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='thisurlprobablydoesntexist.com', port=80): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known',))
-1 Connection Error

Por defecto, Python enviará mensajes de registro de error estándar (stderr). Esto parece que no hemos suprimido la salida de rastreo en absoluto. Sin embargo, si se llama de nuevo, mientras que la reorientación de la stderr, se puede ver que el sistema de registro está funcionando y que puede guardar los registros de nuestro fuera para más adelante:

$ python urlcaller.py http:/hisurlprobablydoesntexist.com 2> my-logs.log
-1 Connection Error

Conclusión

El pitón de rastreo contiene una gran información que puede ayudar a encontrar lo que va mal en el código Python. Estas trazas de retorno puede parecer un poco intimidante, pero una vez que lo rompe hacia abajo para ver lo que está tratando de mostrar que, pueden ser muy útiles. Yendo a través de una línea pocas trazas de retorno de línea le dará una mejor comprensión de la información que contienen y ayuda a sacar el máximo provecho de ellos.

conseguir una salida de rastreo de Python cuando se ejecuta el código es una oportunidad para mejorar su código. Es una forma de Python intenta ayudarte.

Ahora que ya sabe cómo leer un rastreo de Python, puede beneficiarse de aprender más acerca de algunas herramientas y técnicas para el diagnóstico de los problemas que su salida de rastreo que está hablando. Pitón del módulo integrado de rastreo se pueden utilizar para trabajar con e inspeccionar los rastreos. El módulo de rastreo puede ser útil cuando se necesita sacar más provecho de la salida de rastreo. También sería útil para aprender más sobre algunas técnicas para depurar el código Python.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *