Manejo de excepciones en Python
Python proporciona dos funciones muy importantes para manejar las excepciones y errores que ocurren durante la ejecución de un programa Python. Puedes usar estas funciones para depurar programas Python.
- Manejo de excepciones: este tutorial de Python lo explicará en detalle.
- Aserciones (Assertions): este tutorial de Python lo explicará en detalle.
Excepciones estándar de Python
| Nombre de la excepción | Descripción |
|---|---|
| BaseException | Clase base de todas las excepciones |
| SystemExit | El intérprete solicita salir |
| KeyboardInterrupt | El usuario interrumpió la ejecución (normalmente al presionar ^C) |
| Exception | Clase base para errores generales |
| StopIteration | El iterador no tiene más valores |
| GeneratorExit | El generador (generator) genera una excepción para notificar la salida |
| StandardError | Clase base de todas las excepciones estándar integradas |
| ArithmeticError | Clase base para todos los errores de cálculo numérico |
| FloatingPointError | Error de cálculo de coma flotante |
| OverflowError | La operación numérica excede el límite máximo |
| ZeroDivisionError | División (o módulo) por cero (todos los tipos de datos) |
| AssertionError | La sentencia assert falló |
| AttributeError | El objeto no tiene este atributo |
| EOFError | No hay entrada incorporada, se alcanzó la marca EOF |
| EnvironmentError | Clase base de errores del sistema operativo |
| IOError | Falló la operación de entrada/salida |
| OSError | Error del sistema operativo |
| WindowsError | Falló la llamada al sistema |
| ImportError | Falló la importación del módulo/objeto |
| LookupError | Clase base para consultas de datos inválidas |
| IndexError | No existe este índice (index) en la secuencia |
| KeyError | No existe esta clave en el mapeo |
| MemoryError | Error de desbordamiento de memoria (no fatal para el intérprete de Python) |
| NameError | Objeto no declarado/inicializado (sin atributos) |
| UnboundLocalError | Acceso a una variable local no inicializada |
| ReferenceError | Una referencia débil (Weak reference) intentó acceder a un objeto que ya fue recolectado como basura |
| RuntimeError | Error general de tiempo de ejecución |
| NotImplementedError | Método aún no implementado |
| SyntaxError | Error de sintaxis de Python |
| IndentationError | Error de indentación |
| TabError | Mezcla de tabulaciones y espacios |
| SystemError | Error general del sistema del intérprete |
| TypeError | Operación no válida para el tipo |
| ValueError | Se pasó un argumento inválido |
| UnicodeError | Errores relacionados con Unicode |
| UnicodeDecodeError | Error al decodificar Unicode |
| UnicodeEncodeError | Error al codificar Unicode |
| UnicodeTranslateError | Error al convertir Unicode |
| Warning | Clase base de advertencias |
| DeprecationWarning | Advertencia sobre características obsoletas (deprecadas) |
| FutureWarning | Advertencia sobre construcciones cuya semántica cambiará en el futuro |
| OverflowWarning | Antigua advertencia sobre la promoción automática a entero largo (long) |
| PendingDeprecationWarning | Advertencia sobre características que serán obsoletas (deprecadas) |
| RuntimeWarning | Advertencia sobre comportamiento de tiempo de ejecución (runtime behavior) sospechoso |
| SyntaxWarning | Advertencia sobre sintaxis sospechosa |
| UserWarning | Advertencia generada por el código del usuario |
¿Qué es una excepción?
Una excepción es un evento que ocurre durante la ejecución del programa y afecta la ejecución normal del mismo.
En general, cuando Python no puede manejar el programa correctamente, se produce una excepción.
Una excepción es un objeto de Python que representa un error.
Cuando ocurre una excepción en un script de Python, necesitamos capturarla y manejarla; de lo contrario, el programa terminará su ejecución.
Manejo de excepciones
Para capturar excepciones se puede usar la sentencia try/except.
La sentencia try/except se utiliza para detectar errores en el bloque de la sentencia try, permitiendo que la sentencia except capture la información de la excepción y la maneje.
Si no quieres que tu programa termine cuando ocurre una excepción, simplemente captúrala en el try.
Sintaxis:
A continuación se muestra la sintaxistry....except...elsesimple de:
try: <语句> #运行别的代码 except <名字>: <语句> #如果在try部份引发了'name'异常 except <名字>,<数据>: <语句> #如果引发了'name'异常,获得附加的数据 else: <语句> #如果没有异常发生
El funcionamiento de try es el siguiente: cuando se inicia una sentencia try, Python hace una marca en el contexto del programa actual, de modo que cuando aparezca una excepción pueda volver a este punto. La cláusula try se ejecuta primero; lo que suceda después depende de si ocurre una excepción durante la ejecución.
- Si ocurre una excepción al ejecutar las sentencias después de try, Python salta de vuelta a try y ejecuta la primera cláusula except que coincida con dicha excepción. Una vez manejada la excepción, el flujo de control continúa a través de toda la sentencia try (a menos que al manejar la excepción se genere una nueva excepción).
- Si ocurre una excepción en las sentencias después de try pero no hay una cláusula except que coincida, la excepción se enviará al try de nivel superior, o al nivel más alto del programa (lo que terminará el programa e imprimirá el mensaje de error predeterminado).
- Si no ocurre ninguna excepción durante la ejecución de la cláusula try, Python ejecutará las sentencias después de la cláusula else (si existe else), y luego el flujo de control continúa a través de toda la sentencia try.
Ejemplo
A continuación se muestra un ejemplo simple que abre un archivo, escribe contenido en él y no se produce ninguna excepción:
Ejemplo
# -*- coding: UTF-8 -*-
try:
fh = open("testfile", "w")
fh.write("Este es un archivo de prueba para probar excepciones!!")
except IOError:
print "Error: no se encontró el archivo o falló la lectura del archivo"
else:
print "Contenido escrito en el archivo correctamente"
fh.close()
El resultado de salida del programa anterior es:
$ python test.py 内容写入文件成功 $ cat testfile # 查看写入的内容 这是一个测试文件,用于测试异常!!
Ejemplo
A continuación se muestra un ejemplo simple que abre un archivo, escribe contenido en él, pero el archivo no tiene permiso de escritura, por lo que se produce una excepción:
Ejemplo
# -*- coding: UTF-8 -*-
try:
fh = open("testfile", "w")
fh.write("Este es un archivo de prueba para probar excepciones!!")
except IOError:
print "Error: no se encontró el archivo o falló la lectura del archivo"
else:
print "Contenido escrito en el archivo correctamente"
fh.close()
Antes de ejecutar el código, para mayor comodidad en las pruebas, podemos quitar primero el permiso de escritura del archivo testfile, con el siguiente comando:
chmod -w testfile
Luego ejecuta el código anterior:
$ python test.py Error: 没有找到文件或读取文件失败
Usar except sin ningún tipo de excepción
Puedes usar except sin ningún tipo de excepción, como en el siguiente ejemplo:
try:
正常的操作
......................
except:
发生异常,执行这块代码
......................
else:
如果没有异常执行这块代码
La forma anterior de la sentencia try-except captura todas las excepciones que ocurran. Pero esta no es una buena manera, porque no podemos identificar la información específica de la excepción mediante este programa, ya que captura todas las excepciones.
Usar except con múltiples tipos de excepción
También puedes usar la misma sentencia except para manejar múltiples informaciones de excepción, como se muestra a continuación:
try:
正常的操作
......................
except(Exception1[, Exception2[,...ExceptionN]]):
发生以上多个异常中的一个,执行这块代码
......................
else:
如果没有异常执行这块代码
La sentencia try-finally
La sentencia try-finally ejecutará el código final sin importar si ocurre o no una excepción.
try: <语句> finally: <语句> #退出try时总会执行 raise
Ejemplo
Ejemplo
# -*- coding: UTF-8 -*-
try:
fh = open("testfile", "w")
fh.write("Este es un archivo de prueba para probar excepciones!!")
finally:
print "Error: no se encontró el archivo o falló la lectura del archivo"
Si el archivo abierto no tiene permiso de escritura, la salida es la siguiente:
$ python test.py Error: 没有找到文件或读取文件失败
El mismo ejemplo también se puede escribir de la siguiente manera:
Ejemplo
# -*- coding: UTF-8 -*-
try:
fh = open("testfile", "w")
try:
fh.write("Este es un archivo de prueba para probar excepciones!!")
finally:
print "Cerrando archivo"
fh.close()
except IOError:
print "Error: no se encontró el archivo o falló la lectura del archivo"
Cuando se lanza una excepción en el bloque try, el código del bloque finally se ejecuta inmediatamente.
Después de que se ejecutan todas las sentencias del bloque finally, la excepción se vuelve a lanzar y se ejecuta el código del bloque except.
El contenido de los argumentos es diferente de la excepción.
Los argumentos de la excepción
Una excepción puede llevar argumentos, que pueden servir como parámetros de información de excepción en la salida.
Puedes capturar los argumentos de la excepción mediante la sentencia except, como se muestra a continuación:
try:
正常的操作
......................
except ExceptionType, Argument:
你可以在这输出 Argument 的值...
El valor de excepción recibido por la variable generalmente está incluido en la sentencia de la excepción. En forma de tupla, la variable puede recibir uno o más valores.
La tupla generalmente contiene la cadena de error, el número de error y la ubicación del error.
Ejemplo
A continuación se muestra un ejemplo de una sola excepción:
Ejemplo
# -*- coding: UTF-8 -*-
# Definir función
def temp_convert(var):
try:
return int(var)
except ValueError, Argument:
print "El argumento no contiene un número\n", Argument
# Llamar a la función
temp_convert("xyz")
El resultado de ejecución del programa anterior es el siguiente:
$ python test.py 参数没有包含数字 invalid literal for int() with base 10: 'xyz'
Provocar excepciones
Podemos usar la sentencia raise para provocar excepciones nosotros mismos.
El formato de la sintaxis de raise es el siguiente:
raise [Exception [, args [, traceback]]]
En la sentencia, Exception es el tipo de excepción (por ejemplo, NameError), uno de los parámetros de las excepciones estándar; args son los argumentos de excepción proporcionados por uno mismo.
El último parámetro es opcional (rara vez se usa en la práctica); si existe, es el objeto de seguimiento de la excepción.
Ejemplo
Una excepción puede ser una cadena, una clase o un objeto. La mayoría de las excepciones proporcionadas por el núcleo de Python son clases instanciadas; este es un parámetro de una instancia de clase.
Definir una excepción es muy simple, como se muestra a continuación:
Ejemplo
if level < 1:
raise Exception("Invalid level!", level)
# Después de lanzar la excepción, el código posterior ya no se ejecutará
Nota:Para poder capturar la excepción, la declaración "except" debe usar la misma excepción para lanzar el objeto de clase o la cadena.
Por ejemplo, para capturar la excepción anterior, la declaración "except" es como se muestra a continuación:
try:
正常逻辑
except Exception,err:
触发自定义异常
else:
其余代码
Ejemplo
Ejemplo
# -*- coding: UTF-8 -*-
# Definir la función
def mye( level ):
if level < 1:
raise Exception,"Invalid level!"
# Después de lanzar la excepción, el código posterior ya no se ejecutará
try:
mye(0) # Lanzar la excepción
except Exception,err:
print 1,err
else:
print 2
Al ejecutar el código anterior, el resultado es:
$ python test.py 1 Invalid level!
Excepciones definidas por el usuario
Al crear una nueva clase de excepción, los programas pueden nombrar sus propias excepciones. Las excepciones deberían típicamente heredar de la clase Exception, de forma directa o indirecta.
A continuación se muestra un ejemplo relacionado con RuntimeError; en el ejemplo se crea una clase cuya clase base es RuntimeError, utilizada para generar más información cuando se lanza la excepción.
En el bloque try, después de la excepción definida por el usuario se ejecuta el bloque except; la variable e es la instancia de la clase Networkerror.
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
Después de definir la clase anterior, puedes lanzar la excepción de la siguiente manera:
try:
raise Networkerror("Bad hostname")
except Networkerror,e:
print e.args
Otras extensiones