Excepciones
Errores sintácticos y errores de ejecución
Los errores sintácticos se producen cuando tenemos algo mal escrito en nuestro código fuente. Veamos un ejemplo de error sintáctico:
>>> while True print('Hello world')
File "<stdin>", line 1
while True print('Hello world')
^
SyntaxError: invalid syntax
Una excepción o un error de ejecución se produce durante la ejecución del programa. Las excepciones se puede manejar para que no termine el programa. Veamos algunos ejemplos de excepciones:
>>> 4/0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> a+4
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> "2"+2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly
Hemos obtenido varias excepciones: ˋZeroDivisionErrorˋ, ˋNameErrorˋ y ˋTypeErrorˋ. Puedes ver la lista de excepciones y su significado.
Manejando excepciones
Veamos un ejemplo simple como podemos tratar una excepción:
>>> while True:
... try:
... x = int(input("Introduce un número:"))
... break
... except ValueError:
... print ("Debes introducir un número")
- Se ejecuta el bloque de instrucciones de
try. - Si no se produce la excepción, el bloque de
exceptno se ejecuta y continúa la ejecución secuencia. - Si se produce una excepción, el resto del bloque
tryno se ejecuta, si la excepción que se ha produce corresponde con la indicada enexceptse salta a ejecutar el bloque de instruccionesexcept. - Si la excepción producida no se corresponde con las indicadas en
exceptse pasa a otra instruccióntry, si finalmente no hay un manejador nos dará un error y el programa terminará.
Un bloque except puede manejar varios tipos de excepciones, si quiero controlar varios tipos de excepciones puedo poner varios bloques except. Teniendo en cuenta que en el último, si quiero no indico el tipo de excepción:
>>> try:
... print (10/int(cad))
... except ValueError:
... print("No se puede convertir a entero")
... except ZeroDivisionError:
... print("No se puede dividir por cero")
... except:
... print("Otro error")
Se puede utilizar también la clausula else:
>>> try:
... print (10/int(cad))
... except ValueError:
... print("No se puede convertir a entero")
... except ZeroDivisionError:
... print("No se puede dividir por cero")
... else:
... print("Otro error")
Por último indicar que podemos indicar una clausula finally para indicar un bloque de instrucciones que siempre se debe ejecutar, independientemente de la excepción se haya producido o no.
>>> try:
... result = x / y
... except ZeroDivisionError:
... print("División por cero!")
... else:
... print("El resultado es", result)
... finally:
... print("Terminamos el programa")