2010-07-08 8 views
8

¿Funcionará?¿Excepciones anidadas?

try: 
    try: 
     field.value = filter(field.value, fields=self.fields, form=self, field=field) 
    except TypeError: 
     field.value = filter(field.value) 
except ValidationError, e: 
    field.errors += e.args 
    field.value = revert 
    valid = False 
    break    

Es decir, si esa primera línea lanza una ValidationError, lo hará el segundo retén except ella?

Lo habría escrito sin anidar, pero la segunda declaración de filtro también podría fallar. Y quiero usar el mismo bloque ValidationError para captar eso también.

que había prueba yo mismo, pero este código es tan entrelazada ahora es difícil tropezar correctamente :)

Como nota al margen, ¿es malo para confiar en ella para controlar el TypeError y pasando en un solo Arg en cambio? es decir, ¿omite deliberadamente algunos argumentos donde no son necesarios?

+2

Usted no tiene que probar el código en el lugar. Sería bastante fácil crear una nueva secuencia de comandos python, y simplemente colocarse en una línea de generación de excepciones donde quiera probar ese comportamiento. –

+0

@Anon: Tienes razón ... Creo que fue más fácil realizar el experimento de lo que pensaba. – mpen

Respuesta

17

Si la instrucción de filtro en el intento interno genera una excepción, primero se verificará contra el conjunto interno de declaraciones "excepto" y, si ninguno de ellos lo detecta, se comprobará con el conjunto externo de "excepto "declaraciones.

Puede convencerse de que este es el caso, sólo por hacer algo tan simple como este (esto sólo se imprimirá "Atrapados el error de valor"):

try: 
    try: 
     raise ValueError('1') 
    except TypeError: 
     print 'Caught the type error' 
except ValueError: 
    print 'Caught the value error!' 

Como otro ejemplo, éste debe imprimir "Atrapados la ValueError interior" solamente:

try: 
    try: 
     raise ValueError('1') 
    except TypeError: 
     pass 
    except ValueError: 
     print 'Caught the inner ValueError!' 
except ValueError: 
    print 'Caught the outer value error!' 
+0

Oh ... ahora has agregado el otro caso. Diría ... tengo que esperar un minuto para aceptarte. (jaja ... "puedes aceptar esta respuesta en 0 segundos" - ¡qué momento!) – mpen

+0

Me sobreexcitaron con el botón "Enviar" la primera vez ;-) –

0

para complementar la respuesta de Brent, y poner a prueba el otro caso:

class ValidationError(Exception): pass 
def f(a): raise ValidationError() 

try: 
    try: 
     f() 
    except TypeError: 
     f(1) 
except ValidationError: 
    print 'caught1' 

try: 
    try: 
     f(1) 
    except TypeError: 
     print 'oops' 
except ValidationError: 
    print 'caught2' 

que imprime:

caught1 
caught2