2012-09-12 2 views
5

tengo:Forzando el flujo de código para ir a excepto de bloques

try: 
    ... 
except Exception, e: 
    print "Problem. %s" % str(e) 

Sin embargo, en algún lugar de intentarlo, necesitaré que se comporte como si se ha encontrado una excepción. ¿Es antipático hacer:

try: 
    ... 
    raise Exception, 'Type 1 error' 
    ... 

except Exception, e: 
    print "Problem. Type 2 error %s" % str(e) 
+0

parece un mal diseño ... pero es común levantar Excepciones ... pero no de esta manera ... . ¿Por qué necesitas hacer esto? Es posible que desee volver a pensar en lo que está tratando de lograr –

+0

El manejo de excepciones generalmente está diseñado para atrapar y manejar _unintended_ failures. Exception _raising_ es para alertar a los consumidores de su función de un error que impidió completar el bloqueo funcional, junto con la información que desee proporcionar. Si solo desea salir de un bloque funcional como parte de un comportamiento previsto, usar una función y sus valores de retorno sería una forma más adecuada de manejar eso. Dicho esto, si intentas probar el comportamiento del bloque 'except', entonces plantear una excepción en' try' sería la forma de hacerlo. –

+0

Pero mira la última sección del tutorial de python: docs.python.org/tutorial/errors.html#raising-exceptions – user1008636

Respuesta

5

Creo que este es un mal diseño. Si necesita realizar alguna acción si (y solo si) no se presentó una excepción, para eso está la cláusula else. Si necesita realizar alguna acción incondicionalmente, para eso sirve finally. aquí está una demostración:

def myraise(arg): 
    try: 
     if arg: 
      raise ValueError('arg is True') 
    except ValueError as e: 
     print(e) 
    else: 
     print('arg is False') 
    finally: 
     print("see this no matter what") 

myraise(1) 
myraise(0) 

Usted necesita un factor en el código incondicional finally y poner las otras cosas en except/else según corresponda.

+0

Pero mira la última sección del tutorial de python: http: //docs.python. org/tutorial/errors.html # raising-exceptions – user1008636

+0

@ user1008636 - Ese es solo el tutorial. Está escrito para hacer explícito que se generó una excepción en 'try' y para demostrar lo que sucede en' except' o 'finally' cuando se produce una excepción. No pretende ser un ejemplo de buen uso para 'try' /' except'. – mgilson

4

Creo que lo que estás haciendo es "unPythonic". Las pruebas solo deberían cubrir la parte pequeña (idealmente, una línea) del código que, en ocasiones, podría fallar de cierta manera. Debería poder usar try/except/else/finally para obtener el comportamiento requerido:

try: 
    #line which might fail 
except ExceptionType: # the exception type which you are worried about 
    #what to do if it raises the exception 
else: 
    #this gets done if try is successful 
finally: 
    #this gets done last in both cases (try successful or not) 
Cuestiones relacionadas