jueves, 25 de abril de 2013

Python excepciones, profundizando mucho más

Vale muy bien, ya sabemos cómo se usan los try. Pero..... no está mal saber que clases de excepciones estándar tenemos disponibles. Os paso un diagrama en árbol de las excepciones estándar más comunes. La más genérica es exception pero si queremos realizar diferentes tratamientos no estaría mal saber algunas más.
Exception(*)
 |
 +-- SystemExit
 +-- StandardError(*)
      |
      +-- KeyboardInterrupt
      +-- ImportError
      +-- EnvironmentError(*)
      |    |
      |    +-- IOError
      |    +-- OSError(*)
      |
      +-- EOFError
      +-- RuntimeError
      |    |
      |    +-- NotImplementedError(*)
      |
      +-- NameError
      +-- AttributeError
      +-- SyntaxError
      +-- TypeError
      +-- AssertionError
      +-- LookupError(*)
      |    |
      |    +-- IndexError
      |    +-- KeyError
      |
      +-- ArithmeticError(*)
      |    |
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      |    +-- FloatingPointError
      |
      +-- ValueError
      +-- SystemError
      +-- MemoryError
Un ejemplo de su uso
parsed = False
while not parsed:
    try:
        x = int(raw_input('Mete el primer valor: '))
        y = int(raw_input('Mete el segundo valor: '))
        result= x/y
    except ValueError:
        print 'Numero introducido erroneo!!!'
    except ZeroDivisionError:
        print "dividir por CERO!! LOKO!!"
    else:
        parsed = True
        print "resultado: ", result
Si queremos provocar la ejecución de una excepción podemos usar raiser.
try:
    raise Exception()
except:
    print "ERROR: ", sys.exc_type + ":", sys.exc_value
Por último nos crearemos nuestra propia excepción.
class MyPropioError(Exception):
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return repr(self.value)

try:
    raise MyPropioError("Algo muy gordo a pasado")
except MyPropioError, e:
    print 'Se ha ejecutado, value:', e.value
Esto mostrará el texto "Algo muy gordo a pasado"