¿Cuál es el uso previsto de la else
cláusula opcional de la try
declaración?
python
exception-handling
geowa4
fuente
fuente
Respuestas:
Las declaraciones en el
else
bloque se ejecutan si la ejecución cae al final de latry
- si no hubo excepción. Honestamente, nunca he encontrado una necesidad.Sin embargo, las notas de manejo de excepciones :
Entonces, si tiene un método que podría, por ejemplo, arrojar un
IOError
, y desea detectar las excepciones, aumenta, pero hay algo más que desea hacer si la primera operación tiene éxito, y no desea detectar un IOError de esa operación, podrías escribir algo como esto:Si solo coloca
another_operation_that_can_throw_ioerror()
despuésoperation_that_can_throw_ioerror
,except
detectaría los errores de la segunda llamada. Y si lo coloca después de todo eltry
bloque, siempre se ejecutará, y no hasta después delfinally
. Elelse
te permite asegurartefinally
bloque, yIOError
s que surja no se ve atrapado aquífuente
return
,continue
obreak
.Hay una gran razón para usar
else
: estilo y legibilidad. En general, es una buena idea mantener el código que puede causar excepciones cerca del código que se ocupa de ellos. Por ejemplo, compare estos:y
El segundo es bueno cuando
except
no puede regresar temprano o volver a lanzar la excepción. De ser posible, habría escrito:Nota: La respuesta copiada del duplicado publicado recientemente aquí , de ahí todo este material "AskPassword".
fuente
Un uso: pruebe algún código que debería generar una excepción.
(Este código debe resumirse en una prueba más genérica en la práctica).
fuente
El uso previsto es tener un contexto para que se ejecute más código si no hubo excepciones donde se esperaba que se manejara.
Este contexto evita el manejo accidental de errores que no esperaba.
Pero es importante entender las condiciones precisas que causan la cláusula else a plazo, porque
return
,continue
ybreak
puede interrumpir el flujo de control aelse
.En resumen
La
else
instrucción se ejecuta si hay no hay excepciones y si no es interrumpida por unareturn
,continue
obreak
comunicado.Las otras respuestas pierden esa última parte.
De los documentos:
(Se agrega negrita). Y la nota al pie dice:
Requiere al menos una cláusula anterior excepto ( ver la gramática ). Entonces, realmente no es "try-else", es "try-except-else (-finally)", con el
else
(yfinally
) siendo opcional.El Tutorial de Python explica el uso previsto:
Ejemplo de diferenciación
else
frente al código que sigue altry
bloqueSi maneja un error, el
else
bloque no se ejecutará. Por ejemplo:Y ahora,
fuente
Try-except-else es ideal para combinar el patrón EAFP con tipeo de pato :
Puede pensar que este código ingenuo está bien:
Esta es una excelente manera de ocultar accidentalmente errores graves en su código. Escribí la limpieza allí, pero se está tragando el AttributeError que me dejaría saber. Peor aún, ¿qué pasaría si lo hubiera escrito correctamente, pero en ocasiones el método de limpieza pasaba un tipo de usuario que tenía un atributo mal nombrado, lo que provocaba un error silencioso a la mitad y dejaba un archivo sin cerrar? Buena suerte depurando eso.
fuente
Me parece realmente útil cuando tienes que hacer la limpieza, incluso si hay una excepción:
fuente
A pesar de que no puedes pensar en un uso en este momento, puedes apostar que tiene que ser útil. Aquí hay una muestra poco imaginativa:
Con
else
:Sin
else
:Aquí tiene la variable
something
definida si no se produce ningún error. Puede eliminar esto fuera deltry
bloque, pero luego requiere una detección desordenada si se define una variable.fuente
something = a[2]; print something
en el intento: bloquear?Hay un buen ejemplo de
try-else
en PEP 380 . Básicamente, se trata de hacer un manejo diferente de excepciones en diferentes partes del algoritmo.Es algo como esto:
Esto le permite escribir el código de manejo de excepciones más cerca de donde ocurre la excepción.
fuente
De errores y excepciones # Excepciones de manejo - docs.python.org
fuente
Mirando la referencia de Python , parece que
else
se ejecuta despuéstry
cuando no hay excepción. La cláusula else opcional se ejecuta si y cuando el control fluye fuera del final de la cláusula try. 2 Las excepciones en la cláusula else no son manejadas por las anteriores, excepto las cláusulas.Sumérgete en Python tiene un ejemplo en el que, si entiendo correctamente, en el
try
bloque intentan importar un módulo, cuando eso falla, obtienes una excepción y se vincula por defecto, pero cuando funciona tienes una opción paraelse
bloquear y vincular lo que se requiere (ver enlace para el ejemplo y explicación).Si intentaste trabajar en
catch
bloque, podría arrojar otra excepción: supongo que ahí es donde elelse
bloque resulta útil.fuente
try
bloque.Eso es. El bloque 'else' de una cláusula try-except existe para el código que se ejecuta cuando (y solo cuando) la operación intentada tiene éxito. Se puede usar y se puede abusar de él.
Personalmente, me gusta y lo uso cuando es apropiado. Agrupa semánticamente las declaraciones.
fuente
Quizás un uso podría ser:
Tal vez esto también te lleve a un uso.
fuente
He encontrado que la
try: ... else:
construcción es útil en la situación en la que está ejecutando consultas de base de datos y registrando los resultados de esas consultas en una base de datos separada del mismo tipo / sabor. Digamos que tengo muchos subprocesos de trabajo que manejan consultas de bases de datos enviadas a una colaPor supuesto, si puede distinguir entre las posibles excepciones que se pueden generar, no tiene que usar esto, pero si el código que reacciona a un fragmento de código exitoso podría arrojar la misma excepción que el fragmento exitoso, y no puede simplemente deje pasar la segunda posible excepción, o regrese inmediatamente en caso de éxito (lo que mataría el hilo en mi caso), entonces esto es útil.
fuente
A
else
menudo puede existir un bloque para complementar la funcionalidad que ocurre en cadaexcept
bloque.En este caso,
inconsistency_type
se establece en cada bloque excepto, de modo que el comportamiento se complementa en el caso sin error enelse
.Por supuesto, estoy describiendo esto como un patrón que puede aparecer en su propio código algún día. En este caso específico, de todos modos solo establece
inconsistency_type
0 antes deltry
bloque.fuente
Aquí hay otro lugar donde me gusta usar este patrón:
fuente
continue
lugar, puede usar el patrón "salir temprano". Esto le permite eliminar la cláusula "else" y su sangría, haciendo que el código sea más fácil de leer.Uno de los escenarios de uso que se me ocurren son las excepciones impredecibles, que se pueden eludir si lo intentas nuevamente. Por ejemplo, cuando las operaciones en el bloque try implican números aleatorios:
Pero si se puede predecir la excepción, siempre debe elegir la validación de antemano sobre una excepción. Sin embargo, no todo se puede predecir, por lo que este patrón de código tiene su lugar.
fuente
break
interiortry
al final, que es IMO más limpio, y no necesita elelse
. Además,continue
no es realmente necesario, puede simplementepass
.He encontrado
else
útil para tratar con un archivo de configuración posiblemente incorrecto:Una excepción al leer la
lock
configuración deshabilita la supervisión de bloqueo y ValueErrors registra un mensaje de advertencia útil.fuente
Suponga que su lógica de programación depende de si un diccionario tiene una entrada con una clave determinada. Puede probar el resultado del
dict.get(key)
uso de laif... else...
construcción, o puede hacer:fuente
Agregaría otro caso de uso que parece sencillo al manejar sesiones de DB:
fuente
El
else:
bloque es confuso y (casi) inútil. También es parte de las declaracionesfor
ywhile
.En realidad, incluso en una
if
declaración,else:
se puede abusar de formas realmente terribles creando errores que son muy difíciles de encontrar.Considera esto.
Piénsalo dos veces
else:
. Generalmente es un problema.if
Evítelo excepto en una declaración e incluso considere documentar laelse
condición - para hacerlo explícito.fuente
if x > 0: return "yes"
yif x <= 0: return "no"
. Ahora viene una persona y cambia una de las condiciones para decir,x > 1
pero se olvida de cambiar la otra. ¿Cómo es esa reducción de la cantidad de errores que se cometerían?if else
a veces las cláusulas están separadas por muchas líneas. DRY es una buena práctica, la mayoría de las veces, en realidad. (Lo siento por el doble post).