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 >>>