2011-01-13 17 views
5

¿Cuándo usa cada uno? Creo que estoy usando mucho más que excepciones. Parece que estoy atrapando las excepciones usando mis "ifs", incluso antes de que los obtenga. Hay todo en mi código.¿Cuándo debe verificar los errores usando "si" y cuándo debe usar las excepciones?

+1

Esto se ha pedido en innumerables ocasiones (2739582, 1152541, 1313812). Entre esta pregunta, su pregunta 4557577 (y sin duda innumerables otras) y sus ahora más de * ochocientas preguntas *, parece que es una especie de spammer de preguntas. –

Respuesta

2

declaraciones intento de captura están diseñados para controlar los errores graves y en particular para la conexión a un servicio externo, como un servicio web, bases de datos, etc. Solicitud web y donde se espera que los errores y a suceder de vez en cuando. Es más pesado en el entorno de tiempo de ejecución manejar una excepción, que escribir un buen código y utilizar las características del lenguaje dado tales como if o operación ternaria.

capturas try no son la primera línea de defensa, que son la última línea de defensa usando prácticas de codificación.

1

Especialmente en lo que se trabaja con aplicaciones de gran tamaño, manejo de excepciones es realmente una mejor práctica. Como mencionaste, recibes muchas declaraciones de if. Con python, el uso de las instrucciones try/except le permite crear una forma más estandarizada de tratar con las excepciones. Con excepciones, obtendrá el beneficio de ver el tipo de clase de excepción, así como cualquier otra clase personalizada que cree. Simplemente te da una forma mucho más estructurada de codificación.

4

EAFP: Easier to ask for forgiveness than permission.

Es estilo común de codificación de Python para suponer la existencia de llaves o atributos válidos y capturar excepciones si el supuesto de prueba falsa.

Esto contrasta con el estilo LBYL (Look before you leap) común a muchos otros lenguajes como C

Actualización 1

Por supuesto, debe asegurarse de que manejar cualquier excepción atrapados y no sólo en silencio ignorarlos de lo contrario, perderás mucho tiempo depurando. pass ¡probablemente no es lo que estás buscando!

Actualización 2

Usted debe coger el excepciones específicas que son esperando a ser raise -d, si son built-in exceptions o de otra manera.

+0

Puse el intento genérico: excepto Exceptione,: print e pass ¿Eso es OK? – TIMEX

+0

@TIMEX: no hay una respuesta genérica aquí. La forma en que maneje la excepción depende del procesamiento que estaba haciendo cuando fue 'raise' -d. ¡Ese 'pase' dicho es muy raramente lo que quieres! – Johnsyweb

+1

Vale la pena señalar que el uso de la manipulación de excepción frente a las instrucciones 'if' le dice al lector de su código algo sobre lo que espera que suceda. Una instrucción 'if' implica que existe una posibilidad considerable de que la condición sea' True' o 'False', mientras' 'try' /' except' implica el manejo de casos extremos. Entonces, aunque EAFP puede ser idóneo python, hay espacio para la interpretación en un caso dado. Además, casi nunca deberías usar 'excepto Excepción 'genérica. – Wilduck

2

No estoy repitiendo lo que muchas personas ya han dicho, pero hay una gran ventaja de la utilización de excepciones que me gustaría mencionar:

Si falla alguna rutina, puede decidir fácilmente en el que el nivel de indirección que debe manejar esa excepción - y usted no tendrá que inflar los niveles más profundos con la comprobación de error después de, digamos, cada paso.

Por supuesto que no le libera de la responsabilidad de tener un buen código de limpieza que dejará todo en claro para cada ruta de ejecución posible: libere los recursos, los sockets, las transacciones commit o rollback, etc.Y hay muchos medios para hacer eso:

  • try... finally bloques, permitiendo que cualquier excepción a propagar, pero la limpieza de todo lo antes (muchos idiomas, incluyendo Python),
  • la with declaración (específico de Python),
  • el paradigma RAII que implica la limpieza en destructores (principalmente C++).
Cuestiones relacionadas