Download Trat. Errores de Ejecución. Clase 24 (21 de Junio, 2011)

Document related concepts
no text concepts found
Transcript
Tratamiento de Errores de
Ejecución: Excepciones
Introducción a la Computación
Clase 24
Patricia Borensztejn
Excepciones
• Las excepciones son errores detectados por Python
durante la ejecución del programa. Cuando el
intérprete se encuentra con una situación excepcional,
como el intentar dividir un número entre 0 o el intentar
acceder a un archivo que no existe, este genera o lanza
una excepción, informando al usuario de que existe
algún problema.
• Si la excepción no se captura el flujo de ejecución se
interrumpe y se muestra la información asociada a la
excepción en la consola de forma que el programador
pueda solucionar el problema.
Excepciones
• Por ejemplo:
def division(a, b):
return a / b
def calcular():
division(1, 0)
calcular()
Traceback (most recent call last):
File "C:/Users/Patricia/programas_python/excepciones.py", line 5, in <module>
calcular()
File "C:/Users/Patricia/programas_python/excepciones.py", line 4, in calcular
division(1, 0)
File "C:/Users/Patricia/programas_python/excepciones.py", line 2, in division
return a / b
ZeroDivisionError: integer division or modulo by zero
Captura de Excepciones
• Las sentencias try-except permiten capturar las
posibles excepciones de nuestro código y evitar
que Python aborte la ejecución.
• Es como un if – then- else… pero mas específico
para el tratamiento de excepciones
try:
f = file(“archivo.txt”)
except:
print “El archivo no existe”
• La sentencia try engloba el código que nosotros
pensamos que puede producir una excepción.
• En caso que la excepción se produzca, se ejecuta
el código que depende de la sentencia except.
Diferentes tipos de errores
• Cuando se produce la división por cero, Python
informa del error: ZeroDivisionError.
• Hay muchos tipos de errores:
>>> 10 * (1/0)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ZeroDivisionError: integer division or modulo by zero
>>> 4 + spam*3
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: cannot concatenate 'str' and 'int' objects
Diferentes tipos de errores
• Si conocemos el error que podría producirse,
podemos generar código según el tipo de
error:
try:
num = int(“3a”)
print no_existe
except NameError:
print “La variable no existe”
except ValueError:
print “El valor no es un numero”
• Si al producirse la excepción, el tipo no
coincide con ninguno de los manejadores de
excepción, Python lanza su manejador.
Diferentes Tipos de Errores
a = float(raw_input(’Valor de a: ’))
b = float(raw_input(’Valor de b: ’))
c = float(raw_input(’Valor de c: ’))
try:
x1 = (-b + sqrt(b**2 - 4*a*c)) / (2 * a)
x2 = (-b - sqrt(b**2 - 4*a*c)) / (2 * a)
if x1 == x2:
print ’Solución de la ecuación: x=%4.3f’ % x1
else:
print ’Soluciones de la ecuación: x1=%4.3f y x2=%4.3f’ % (x1, x2)
except ZeroDivisionError:
if b != 0:
print ’La ecuación no tiene solución.’
else:
print ’La ecuación tiene infinitas soluciones.’
except ValueError:
print ’No hay soluciones reales’
Excepciones definidas
• Las excepciones son objetos pertenecientes a
una clase Base, de la cual derivan muchas
otras clases. Estan definidas en el Módulo
Exception que no es necesario importar.
• Hay una clase Base que se llama: Class
Exception.
• El usuario puede definir nuevas excepciones y
lo hará derivándolas de la clase Exception.
Excepciones Definidas
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StandardError
| +-- BufferError
| +-- ArithmeticError
| | +-- FloatingPointError
| | +-- OverflowError
| | +-- ZeroDivisionError
| +-- AssertionError
| +-- AttributeError
| +-- EnvironmentError
| | +-- IOError
| | +-- OSError
| |
+-- WindowsError (Windows)
| |
+-- VMSError (VMS)
| +-- EOFError
| +-- ImportError
| +-- LookupError
| | +-- IndexError
| | +-- KeyError
| | +-- MemoryError
| +-- NameError
| | +-- UnboundLocalError
| +-- ReferenceError
| +-- RuntimeError
| | +-- NotImplementedError
| +-- SyntaxError
| | +-- IndentationError
| |
+-- TabError
| +-- SystemError
| +-- TypeError
| +-- ValueError
|
+-- UnicodeError
|
+-- UnicodeDecodeError
|
+-- UnicodeEncodeError
|
+-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
Levantar excepciones
• Aunque no se produzca ninguna excepción,
nosotros podemos forzarlas: esto se hace con la
sentencia raise.
>>> raise NameError('Hola')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: Hola
Creando las propias excepciones
• Nosotros podemos definir nuestras propias
excepciones, creando una clase que herede de
la clase Exception
class MiError(Exception):
def __init__(self, valor):
self.valor = valor
def __str__(self):
return “Error “ + str(self.valor)
try:
if resultado > 20:
raise MiError(33)
else: raise MiError(10)
except MiError,e:
print e.valor
print MiError
print e
20
<class '__main__.MiError'>
Error20
>>>