2010-09-28 7 views
13

Sé usar el código a continuación para ignorar una cierta excepción, pero ¿cómo dejar que el código regrese a donde obtuvo la excepción y seguir ejecutándose? Diga si la excepción 'Excepción' se plantea en do_something1, cómo hacer que el código lo ignore y continúe terminando do_something1 y procesando do_something2? Mi código solo va a bloquear después del proceso, excepto en el bloque. por favor asesóreme, gracias.Python Ignorar excepción y volver a donde estaba

try: 
    do_something1 
    do_something2 
    do_something3 
    do_something4 
except Exception: 
    pass 
finally: 
    clean_up 

EDIT: Gracias por la respuesta. Ahora sé cuál es la forma correcta de hacerlo. Pero aquí hay otra pregunta, ¿puedo ignorar una excepción específica? (Por ejemplo, si conozco el número de error). ¿Es posible el siguiente código?

try: 
    do_something1 
except Exception.strerror == 10001: 
    pass 

try: 
    do_something2 
except Exception.strerror == 10002: 
    pass 
finally: 
    clean_up 

do_something3 
do_something4 
+0

sí, puede hacerlo, pero no de la manera que lo tiene escrito. He actualizado mi respuesta. – aaronasterling

+0

esto suena como 'en el curriculum vitae de error al lado de VB'' –

+0

@Lie Ryan. ¿VB todavía se considera un lenguaje vivo? – aaronasterling

Respuesta

9

actualización. La forma de ignorar las excepciones específicas es detectar el tipo de excepción que desee, probarla para ver si desea ignorarla y volver a plantearla si no lo hace.

try: 
    do_something1 
except TheExceptionTypeThatICanHandleError, e: 
    if e.strerror != 10001: 
     raise 
finally: 
    clean_up 

Tenga en cuenta también, que cada declaración try necesita su propia cláusula finally si desea que tenga uno. No se adjuntará a la declaración anterior try. Una declaración raise con nada más es la forma correcta de volver a subir la última excepción. No dejes que nadie te diga lo contrario.


Lo que desea son las continuaciones que python no proporciona de forma nativa. Más allá de eso, la respuesta a tu pregunta depende exactamente de lo que quieras hacer. Si desea que do_something1 continúe independientemente de las excepciones, entonces es tendría que detectar las excepciones e ignorarlas.

si solo desea que do_something2 suceda, independientemente de si do_something1 completa, necesita una declaración try por separado para cada uno.

try: 
    do_something1() 
except: 
    pass 

try: 
    do_something2() 
except: 
    pass 

etc Si usted puede proporcionar un ejemplo más detallado de qué es lo que quieres hacer, entonces hay una buena probabilidad de que yo o alguien más inteligente que yo puedo usted o (más probablemente) Ayuda Discusión salgas de ella y sugieres una alternativa más razonable.

+0

Sí, la lógica es que, 'Excepción' se supone que señala condiciones en las que el flujo normal no puede continuar: su programa necesita desviarse. Dualmente, se supone que los bloques 'try' delimitan el código que es 'dependiente en serie' de lo que fue antes. –

+0

¡Muchas gracias @AaronMcSmooth y todos los demás! – Stan

7

No hay forma directa para que el código regrese dentro del bloque try-except. Sin embargo, si está tratando de ejecutar estas diferentes acciones independientes y sigue ejecutándose cuando falla (sin copiar/pegar el bloque try/except), tendrá que escribir algo como esto:

actions = (
    do_something1, do_something2, #... 
    ) 
for action in actions: 
    try: 
     action() 
    except Exception, error: 
     pass 
10

Esto no tiene el punto de excepciones.

Si la primera declaración ha arrojado una excepción, el sistema está en un estado indeterminado y debe tratar la siguiente declaración como insegura de ejecutar.

Si sabe qué afirmaciones pueden fallar y cómo pueden fallar, puede usar el manejo de excepciones para limpiar específicamente los problemas que pueden ocurrir con un bloque particular de declaraciones antes de pasar a la siguiente sección.

Por lo tanto, la única respuesta real es para manejar excepciones alrededor de cada conjunto de instrucciones que desea tratar como atómica

2

Las excepciones son criados por lo general cuando una tarea de realizar no puede ser completada de la manera indicada por el código debido por ciertas razones. Esto generalmente se plantea como excepciones. Las excepciones deben ser manejadas y no ignoradas. La idea de excepción es que el programa no puede continuar en el flujo de ejecución normal sin resultados anormales.

¿Qué sucede si escribe un código para abrir un archivo y leerlo? ¿Qué pasa si este archivo no existe?

Es mucho mejor hacer una excepción. No puede leer un archivo donde no existe ninguno. Lo que puede hacer es manejar la excepción, informar al usuario que no existe ese archivo. ¿Qué ventaja se obtendría al continuar leyendo el archivo cuando no se podía abrir un archivo?

De hecho, las respuestas anteriores proporcionadas por Aaron se basan en el principio de manejar sus excepciones.

2

puede tener todos los do_something en una lista, y repetirlos de esta manera, por lo que no es tan prolijo. Puede utilizar las funciones lambda lugar si necesita argumentos para las funciones de trabajo

work = [lambda: dosomething1(args), dosomething2, lambda: dosomething3(*kw, **kwargs)] 

for each in work: 
    try: 
     each() 
    except: 
     pass 

cleanup() 
+0

Me di cuenta justo cuando publiqué esto que había un comentario similar, jajaja. lo siento. – Blazer

1

he publicado esto recientemente como respuesta a otra pregunta. Aquí tiene una función que devuelve una función que ignora ("captura") las excepciones especificadas al llamar a cualquier función. Luego invocas la función deseada indirectamente a través de la "trampa".

def maketrap(*exceptions): 
    def trap(func, *args, **kwargs): 
     try: 
      return func(*args, **kwargs) 
     except exceptions: 
      return None 
    return trap 

# create a trap that ignores all exceptions 
trapall = maketrap(Exception) 

# create a trap that ignores two exceptions 
trapkeyattrerr = maketrap(KeyError, AttributeError) 

# Now call some functions, ignoring specific exceptions 
trapall(dosomething1, arg1, arg2) 
trapkeyattrerr(dosomething2, arg1, arg2, arg3) 

En general estoy con los que dicen que haciendo caso omiso de excepciones es una mala idea, pero si lo hace, debe ser lo más específico posible en cuanto a qué excepciones cree que su código puede tolerar.

Cuestiones relacionadas