Cesar Systems

Herramientas Informaticas

A.1.1. No consigo ejecutar mi programa, no importa lo que haga

Si el compilador dice que hay un error pero usted no lo ve, podr³a ser porque usted y el compilador no miran el mismo código.

Compruebe su entorno de programación para asegurarse de que el programa que esta editando es el que esta intentando ejecutar Python. Si no esta seguro, pruebe a poner un error de sintaxis obvio y deliberado al principio del programa. Ahora ejecute (o importe) de nuevo. Si el compilador no encuentra el nuevo error probablemente hay algo equivocado en el modo en que esta configurado su entorno.

Si esto ocurre, puede enfrentarse a ello empezando de nuevo con un programa nuevo como Hola, mundo”, y asegurarse de que puede hacer que funcione un programa conocido. Luego a~nada gradualmente los trozos del programa nuevo al que funciona.

A.2. Errores en tiempo de ejecución

Una vez que su programa es sintácticamente correcto, Python pude importarlo
y al menos comenzar a ejecutarlo.

Que podría ir mal?

A.2.1. Mi programa no hace nada de nada.

Este problema es muy común cuando su archivo consta de funciones y clases pero en realidad no invoca nada para que empiece la ejecución. Esto puede ser intencionado cuando solo planea importar el modulo para suministrar clases y
funciones.

Sin no es intencionado, asegúrese de que esta llamando a una función que inicie la ejecución, o ejecute una desde el indicador interactivo. Vea también la sección Flujo de Ejecución” mas adelante.

A.2.2. Mi programa se cuelga.

Si un programa se para y parece no hacer nada, decimos que se ha colgado”.

A menudo significa que se ha quedado atrapado en un bucle infinito o en una recursión infinita.

  • Si hay un bucle en particular que le resulta sospechoso de provocar el problema, añada una sentencia print justo antes del bucle que diga entrando al bucle” y otra inmediatamente después que diga saliendo del bucle”.
  • Ejecute el programa. Si obtiene el primer mensaje pero el segundo no, tiene usted un bucle infinito. Vaya a la sección Bucle Infinito” mas adelante.
  • Una recursión infinita casi siempre hará que el programa corra un rato y luego presente un error de RuntimeError: Máximum recursión depth exceeded”. Si ocurre eso, vaya a la sección Recursión Infinita” mas adelante.
  • Si no ve este error pero sospecha que hay un problema con un método o función recursivos también puede utilizar las tecnicas de la sección Recursión Infinita”.
  • Si no funciona ninguno de estos pasos, comience a probar otros bucles y otros metodos y funciones recursivos.
  • Si eso no funciona, es posible que no comprenda el flujo de ejecución de su programa. Vaya a la sección Flujo de Ejecución” mas adelante.

Bucle Infinito

Si cree que tiene un bucle infinito y piensa que sabe qué bucle provoca el problema, añada una sentencia print que imprima los valores de las variables de la condición al final del bucle junto con el valor de la condición.

Por ejemplo:

   1: while x > 0 and y < 0 :

   2: # hacer algo con x

   3: # hacer algo con y

   4: print "x: ", x

   5: print "y: ", y

   6: print "condición: ", (x > 0 and y < 0)

 

Ahora, cuando ejecute el programa, verá tres líneas de salida en cada vuelta del bucle. En la última vuelta el valor de la condición debería ser false.

Si el bucle sigue ejecutándose, podrá ver los valores de x e y, y podrá averiguar por qué no se actualizan correctamente.

Recursión Infinita

Una recursión infinita casi siempre hará que el programa se ejecute un rato y luego provoque un error de Máximum recursión depth exceeded.

Si sospecha que una función o un método esta causando una recursión infinita, comience por asegurarse de que hay un caso básico. En otras palabras, debería haber una condición que haga que la función devuelva un valor sin hacer otra llamada recursiva. Si no, necesita revisar el algoritmo y encontrar ese caso básico.

Si hay un caso básico pero el programa no parece llegar hasta el, añada una sentencia print que imprima los parámetros al principio de la función o método.

Cuando ahora ejecute el programa, vera unas pocas líneas cada vez que se invoque la función o método y allí vera los parámetros. Si los parámetros no se acercan al caso básico, eso le dará alguna idea de por que no lo hace.

Flujo de Ejecución

Si no esta seguro de que curso sigue el flujo de ejecución en su programa, añada sentencias print al principio de cada función con un mensaje como entrando en la función tururu“, donde tururu es el nombre de la función.

Cuando ahora ejecute el programa, imprimirá una traza de cada función a medida que las vaya invocando.

A.2.3. Cuando ejecuto el programa recibo una excepción.

Si algo va mal durante la ejecución, Python imprime un mensaje que incluye el nombre de la excepción, la línea del programa donde sucedió el problema y una traza inversa.

La traza inversa identifica la función que se está ejecutando ahora y la función que invocó a esta, y luego la función que invocó a ésa, y así sucesivamente. En otras palabras, traza la ruta de las llamadas a las funciones que le llevaron a donde se encuentra. También incluye los números de las líneas de sus archivos donde suceden todas esas llamadas.

El primer paso es examinar el lugar del programa donde sucede el error y ver si puede adivinar lo que sucedió. Estos son algunos de los errores en tiempo de ejecución más comunes:

NameError: Está intentando usar una variable que no existe en el entorno actual. Recuerde que las variables locales son locales. No puede hacer referencia a ellas desde fuera de la función en la que se definen.

TypeError: Hay varias causas posibles:

Está intentando usar un valor de forma inadecuada.

Ejemplo: usar como índice para una cadena, lista o tupla algo que no es un entero.

  • Hay una discrepancia entre los elementos de una cadena de formato y los elementos pasados para la conversión. Esto puede ocurrir tanto si el numero de elementos no coincide como si se solicita una conversión no válida.
  • Está pasando un numero erróneo de argumentos a una función o método. Con los métodos, fíjese en la definición de los métodos y compruebe que el primer parámetro es self. Luego fíjese en la invocación del método; asegúrese de que está invocando el método sobre un objeto del tipo adecuado y dándole correctamente el resto de argumentos.

KeyError: Está tratando de acceder a un elemento de un diccionario con una clave que no está en el diccionario.

AttributeError: Está intentando acceder a un atributo o método que no existe.

IndexError: El índice que está usando para acceder a una lista, cadena o tupla es mayor que su longitud menos uno. Justo antes de donde aparece el error,
añada una sentencia print que muestre el valor del índice y la longitud del vector.

  • Es correcto el tamaño del vector?
  • Tiene el índice un valor correcto?

A.2.4. Puse tantas sentencias print que me ahoga la salida.

Uno de los problemas de usar sentencias print para la depuración es que puede terminar enterrado en información.

Hay dos formas de atajar el problema:

  • Simplificar la salida
  • Simplificar el programa.

Para simplificar la salida, puede eliminar o comentar (convertir en comentarios)

las sentencias print que no sean de ayuda, o combinarlas, o dar a la salida un formato que la haga mas comprensible.

 

Para simplificar el programa puede hacer varias cosas. Primero, reducir la escala del problema en el que esta trabajando el programa.

Por ejemplo, si esta ordenando un vector, ordene un vector pequeño. Si el programa acepta entradas del usuario, dele la entrada mas simple que provoque el problema.

Segundo, limpie el programa. Elimine el código muerto y reorganice el programa para hacerlo tan legible como sea posible.

Por ejemplo, si sospecha que el problema esta en una parte del programa con un anidamiento muy profundo, pruebe a reescribir esa parte con una estructura mas simple. Si sospecha de una función grande, trate de trocearla en funciones menores y pruébelas separadamente.

El proceso de encontrar el caso mínimo de prueba le llevara a menudo al error.

Si se encuentra con que un programa funciona en una situación pero no en otra, eso le dará una pista sobre lo que ocurre.

De forma parecida, la reescritura de una porción de código puede ayudarle a encontrar errores sutiles. Si hace un cambio que a usted le parece que no afecta al programa, pero sí lo hace, le dará una pista.

A.3. Errores semánticos

En cierto modo, los errores semánticos son los mas difíciles de corregir, porque el compilador y el sistema de ejecución no proporcionan información sobre lo que va mal. Solo usted sabe lo que se supone que debe hacer el programa, y solo
usted sabe que no lo esta haciendo.

El primer paso es hacer una conexión entre el texto del programa y el compro- atamiento que esta usted viendo. Necesita una hipótesis sobre lo que realmente esta haciendo el programa. Una de las dificultades que nos encontramos para ello es la alta velocidad de los computadores.

A menudo desearía ralentizar el programa a una velocidad humana, y con algunos programas depuradores podrá hacerlo. Pero el tiempo que lleva colocar unas sentencias print en los lugares adecuados suele ser menor que el que lleva configurar el depurador, poner y quitar puntos de interrupción y hacer caminar el programa hasta donde se produce el error.

Página 128 de 143

Creado con WordPress & Tema de Anders Norén