Manejar excepciones en Python

python error

Si lo que necesitas es manejar excepciones en Python, para adecuar tu código a determinada exigencias, el lenguaje nos da suficientes herramientas para ello.

En este ejemplo que hemos tomado de aquí , se le pide al usuario una entrada hasta que ingrese un entero válido; sin embargo también se le permite un modo de interrumpir el programa la ejecución del programa, usando Control-C.

Esta interrupción se recoge generando la excepción KeyboardInterrupt.

>>> while True:
...     try:
...         x = int(input("Please enter a number: "))
...         break
...     except ValueError:
...         print("Oops!  That was no valid number.  Try again...")
...

Las excepciones se manejan con las sentencias try y except

Manejar las excepciones

La sentencia try funciona de la siguiente manera.

  • Primero, se ejecuta la cláusula try  que ejecuta el código que exista entre entre las palabras reservadas try y  except).
  • Si no ocurre ninguna excepción, la cláusula except() se omite y la ejecución de la cláusula try finaliza.
  • Si una excepción ocurre durante la ejecución de try, el resto de la clausula se salta.
  • En ese caso si su tipo coincide con la excepción nombrada después de la palabra clave except, se ejecuta la cláusula except, y luego la ejecución continúa después del bloque try / except.

Si la excepción que ocurre no coincide con la excepción nombrada en la cláusula except,  se pasa a ejecutar las sentencias try externas; y si no se encontraran, entonces el interprete considerará excepción como una excepcion no controlada y  detendrá la ejecución, lanzando un mensaje como el que aparece en el ejemplo.  

Una declaración try() puede tener más de una cláusula except, para especificar manejadores para diferentes excepciones que corresponden a un mismo try().

No obstante, como máximo, se ejecutará un controlador.

Los manejadores solo manejan las excepciones que ocurren en la cláusula try correspondiente.

Una cláusula except puede nombrar múltiples excepciones, empleando  una tupla entre paréntesis, por ejemplo:

... except (RuntimeError, TypeError, NameError):
...     pass

Si declaramos una clase en una cláusula except esta será  compatible con una excepción, si es la misma clase o una clase base de la misma.

Esto no funciona al revés, o sea  una cláusula except que enumera una clase derivada no es compatible con una clase base.

Por ejemplo, el siguiente código imprimirá B, C, D en ese orden:

class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass

for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")

Si invirtiéramos las cláusulas, colocando except B primero, obtendríamos como resultado B,B,B, ya que una vez que el bucle alcanza el primera coincidencia se lanza la excepción.

Todas las excepciones heredan de BaseException,  de modo que puede emplearse como comodín.

No obstante dado que las excepciones pueden enmascar un error de programación real , es recomendable emplearlo con cuidado.

La instrucción try ... except tiene una cláusula else opcional, que, cuando está presente, seguir a las cláusulas except.

Es útil para el código que debe ejecutarse si la cláusula try no genera una excepción. Por ejemplo:

De este modo else() evita capturar accidentalmente una excepción que no fue generada por el código que está protegido por la declaración try … except.

Cuando ocurre una excepción, puede tener un valor asociado, también conocido como el argumento de la excepción. La presencia y el tipo de argumento depende del tipo de excepción.

La cláusula except puede especificar una variable después del nombre de la excepción.

Dicha variable está vinculada a una instancia de excepción con los argumentos almacenados en instance.args.

Por conveniencia, la instancia de excepción define __str __ () para que los argumentos se puedan imprimir directamente sin tener que hacer referencia a .args.

También se puede crear una instancia de una excepción antes de generarla y agregarle los atributos que desee.

>>> try:
...     raise Exception('spam', 'eggs')
... except Exception as inst:
...     print(type(inst))    # instancia de la excepcion
...     print(inst.args)     # argumentos guardados en .args
...     print(inst)          # __str__ permite args para que          
                             #sean imprimidos directamente
...                          # pero pueden ser sobrescritos 
                             #en las subclases de la            
                             #excepcion
...     x, y = inst.args     # desempaquetando  args
...     print('x =', x)
...     print('y =', y)
...
<class 'Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs

Cuando una excepción tiene argumentos, estos se imprimen en la parte final del mensaje para las excepciones no gestionadas (“Unhandled exception”).

Los controladores de excepciones no solo manejan las excepciones si ocurren inmediatamente en la cláusula try, sino también si ocurren dentro de funciones que se llaman (incluso indirectamente) en la cláusula try.

Por ejemplo:

>>> def this_fails():
...     x = 1/0
...
>>> try:
...     this_fails()
... except ZeroDivisionError as err:
...     print('Handling run-time error:', err)
...
Handling run-time error: division by zero

…. siempre habrá poesía

J. A. Becquer

AttributeError: module urllib has no attribute urlopen 

error en python


Si alguna vez al trabajar con la librería urllib, te ha lanza AttributeError: module urllib has no attribute urlopen, te explico como se resuelve, más adelante.

El error en principio se debe a que el método urllib.urlopen() funciona con Python 2 y seguramente desarrollas sobre Python3.

Otros artículos sobre Python

La solución es importar urllib.request, que es donde podemos hallar urlopen en Python3.

Entonces al llamarla puedes hacer:

 urllib.request.urlopen(…)

Y hasta aquí.

Deseo sinceramente que esto sirva de ayuda a alguien.

Hay que sembrar un árbol, un ansia, un sueño, un hijo, porque la vida es eso , sembrar, sembrar, sembrar

Error _xsrf’ argument missing from post

python error

Si aparece el error _xsrf’ argument missing from post, mientras trabajas  con Jupyter Notebook , indicando que no se guarda el archivo, puedes probar una de estas soluciones.

Abre otro cuaderno, que no esté en ejecución, pero que exista, en el mismo kernel, y el problema desaparecerá.

Otros errores en Python

Ahora podrás volver a guardar los cuadernos que anteriormente mostraban el error _xsrf.

Una opción que puede funcionar si lo anterior no resuelve el problema es ir a la página de inicio de Jupyter y actualice el navegador.

En caso de hayas cerrado la página de inicio de Jupyter, puedes encontrar un enlace en la terminal desde la que iniciaste Jupyter notebook.

Espero modestamente, que este post sirva de ayuda  a alguien.

…. no recuerdo ya el lugar de donde vengo y pueda que no exista el sitio adonde voy..

J. Sabina.

Error unrecognized arguments: -f en Jupyter notebook

python error

El error unrecognized arguments: -f que aparece al usar Jupyter notebook, si estamos usando argparse(), puede tener una fácil solución.

 Si has utilizado la sentencia:

parser = parser.parse_args()

Esta puede ser la causante de tu error.

Ver otros errores en Python

Puedes resolverlo escribiendo en su lugar:

parser = parser.parse_args(args=[])

Y hasta aquí ,espero que sirva de ayuda, a alguien.

Muchas gracias

El que siempre soño, tiene derecho a ganar

I.Delgado

NameError: name ‘raw_input’ is not defined

python error

El mensaje de error «NameError: name ‘raw_input’ is not defined», nos dice que estamos haciendo referencia a un valor que no existe.

La explicación es sencilla, debido a que estamos usando Python 3.x para ejecutar nuestro programa, raw_input() no existe.

El error «NameError: name raw_input is not defined«, se genera cuando intentamos usar el método raw_input () en Python 3.

Para corregir este error, reemplaza todas las instancias de raw_input() con la función input() en tu código.

Otros errores de Python

Una solución que técnicamente funciona, pero que no recomiendo, es asignar el valor de raw_input() a la función input().

Podemos hacer esto, usando la asignación de variables y esto técnicamente permitirá usar raw_input () en Python 3.

Seria algo como esto:

raw_input =  input

Esta declaración, le dice a Python que el valor de raw_input() debe ser igual a input().

No se recomienda

Aunque este técnicamente probada, esta no es una buena solución, y esto es porque otros desarrolladores que lean el código pueden confundirse si ven raw_input() en una base de código de Python 3, teniendo en cuenta que en la documentación oficial de Python 3  se eliminó el nombre raw_input() a favor de input().

Espero que esto sirva de ayuda a alguien

Muchas gracias.

No podía despreciarlo, era el ultimo brindis de un bohemio por una reina

Error UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xe1 in position …….

python error

 La solución más rápida al error, «Error UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xe1 in position…» es emplear Sublime Text .

Abrimos nuestro archivo con sublime text y en la opción guardar con encoding guardarlo como UTF 8

Existen otras opciones, veamoslas

Codificar al leer el archivo

Hacer el encoding a UTF-8 al hacer el csv_read(), pasando en el parámetro encoding() la codificación que esperamos.

Importar   chardet y  codificar en la lectura del archivo.

import chardet
with open('data/atp-tour/data.csv', 'rb') as f: result = chardet.detect(f.read())
result['encoding']
Output: 'Windows-1252'

Si lanza un warning de LOW MEMORY se deberá principalmente a los tipos de adivinación por columna, están empleando mucha memoria.

Esto sucede en esencia, porque Pandas solo puede determinar qué tipo de dato tiene cada columna, solamente una vez que lee todo el archivo.

Puede ayudar especificar el tipo de archivo, indicándolo en el parámetro dtype , con la sintaxis.

dtype = {'user_id': int}

Esto es solo recomendable, si sabemos que no encontraremos otro tipo de dato en esa columna, si no cumplimos este precepto, complicaremos la situación , porque se bloqueará la carga.

Hay un poco mas sobre esto en este link

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias

Puedo absorber tus pecados, pero no vivir tu vida.

Y

TypeError: argument of type ‘NoneType’ is not iterable. Python

python error

El error, TypeError: argument of type ‘NoneType’ is not iterable, que Python lanza, obedece, según mi experiencia, a casos en que una función con una declaración  condicional (if, else, case, etc) no devuelve un resultado o lo  devuelve vacío.

Si esto sucede, Python devuelve un valor por defecto que es None, el cual no es iterable, por tanto en la próxima iteración lanzara un error.

La solución a esto, es detener la iteración en casos donde pueda haber un valor vacío (por ejemplo utilizando break), o añadiendo acciones (por ejemplo con while), de modo que se solucione o detenga la iteración.

«Puedo absorber tus pecados, pero no vivir tu vida.»

Y

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias

Error «Premature end of data in tag badges line 1 in country_module_list.xml file» en Prestashop 1.6

error prestashop

El error «Premature end of data in tag badges line 1 in country_module_list.xml file», puede aparecer en Prestashop 1.6, de manera imprevista y sin aparente causa.

Este suele venir acompañado de otros errores, en un listado que es más o menos como el que vemos a continuación:

  1. Error found : StartTag: invalid element name in country_module_list.xml file.
  2. Error found : Premature end of data in tag badges line 1 in country_module_list.xml file.
  3. Error found : Premature end of data in tag module line 1 in country_module_list.xml file.
  4. Error found : Premature end of data in tag modules line 1 in country_module_list.xml file.
  5. Error found : CData section not finished Allow the purchase of combinations of products wit in must_have_module_list.xml file.
  6. Error found : Premature end of data in tag additional_description line 1 in must_have_module_list.xml file.
  7. Error found : Premature end of data in tag module line 1 in must_have_module_list.xml file.
  8. Error found : Premature end of data in tag modules line 1 in must_have_module_list.xml file.

La solución a este error es una acción combinada que incluye estos tres pasos:

Eliminar estos archivos en /config/xml 

Limpiar la cache de nuestra tienda

Acceder a al archivo classes siguiendo la ruta public_html/classes y modificar estas líneas.

protected static $is_addons_up = true;
    public static function addonsRequest($request, $params = array())
    {
        return false;
        if (!self::$is_addons_up) {
            return false;

La causa de este error en PS 1.6 parece ser que el servidor de addons(complementos), crea archivos xml, no válidos o no reconocibles como válidos.

Espero que este post ayude a alguien.

Gracias

También yo tengo esos momentos en los que soy asesino, juez y victima.

Y.

TypeError: ‘int’ object is not iterable. Python

python error

El error TypeError: ‘int’ object is not iterable, puede ser lanzado en Python, cuando intentamos iterar dentro de un vector, pero no indicamos un rango de recorrido.

Revisa si tienes algo como esto:

for i in len(vector)

Intenta cambiarlo por esto.

for I in range(len(vector))

Puedes ver aquí la causa del error index out of range

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias

«…..lo que realmente importa no es lo que te da la vida, sino lo que haces con ello….»

Error EOL while scanning string literal

python error

Error EOL while scanning string literal es un error común, que suele aparecer cuando comenzamos a trabajar con Python, e incluso si no somos cuidadosos también después es :

EOL while scanning string literal 

Este error se debe a un error en la sintaxis del script que hemos escrito.

Las causas más comunes en mi caso, eran con los saltos de línea o no cerrar una cadena , como en estos ejemplos a continuación:

foo = 'texto de ejemplo

df.Shape.value_counts().plot(kind=bar', alpha=0.5)

En ambos casos me he saltado una comilla y al momento de correr mi script obtendré el dichoso error.

Otros errores en Python

De igual modo sucedería, si en  vez de no colocar la comilla, la coloco en la siguiente línea:

 foo = 'texto de ejemplo
'

Cuando escribimos texto y queremos añadir un salto de línea, lo correcto es escapar con la solución que nos ofrece Python \

Foo = ‘mi texto\
en líneas\
diferentes\’

Una buena practica es abrir y cerrar las comillas antes de escribir el script.

Muchos editores de código, incluyen la función de autocompletado, lo cual puede ayudarte mucho a evitar este tipo de errores tan comunes.

«Lo que nos hace llegar mas allá, es la misma curiosidad que tiene el niño que quiere saber, lo que hay dentro del juguete»

Translate »