¿Cuál es el uso previsto de la elsecláusula opcional de la trydeclaración?
python
exception-handling
geowa4
fuente
fuente

Respuestas:
Las declaraciones en el
elsebloque 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,exceptdetectaría los errores de la segunda llamada. Y si lo coloca después de todo eltrybloque, siempre se ejecutará, y no hasta después delfinally. Elelsete permite asegurartefinallybloque, yIOErrors que surja no se ve atrapado aquífuente
return,continueobreak.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
exceptno 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,continueybreakpuede interrumpir el flujo de control aelse.En resumen
La
elseinstrucción se ejecuta si hay no hay excepciones y si no es interrumpida por unareturn,continueobreakcomunicado.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
elsefrente al código que sigue altrybloqueSi maneja un error, el
elsebloque 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
somethingdefinida si no se produce ningún error. Puede eliminar esto fuera deltrybloque, pero luego requiere una detección desordenada si se define una variable.fuente
something = a[2]; print somethingen el intento: bloquear?Hay un buen ejemplo de
try-elseen 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
elsese ejecuta despuéstrycuando 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
trybloque intentan importar un módulo, cuando eso falla, obtienes una excepción y se vincula por defecto, pero cuando funciona tienes una opción paraelsebloquear y vincular lo que se requiere (ver enlace para el ejemplo y explicación).Si intentaste trabajar en
catchbloque, podría arrojar otra excepción: supongo que ahí es donde elelsebloque resulta útil.fuente
trybloque.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
elsemenudo puede existir un bloque para complementar la funcionalidad que ocurre en cadaexceptbloque.En este caso,
inconsistency_typese 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_type0 antes deltrybloque.fuente
Aquí hay otro lugar donde me gusta usar este patrón:
fuente
continuelugar, 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
breakinteriortryal final, que es IMO más limpio, y no necesita elelse. Además,continueno 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
lockconfiguració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 declaracionesforywhile.En realidad, incluso en una
ifdeclaració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.ifEvítelo excepto en una declaración e incluso considere documentar laelsecondició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 > 1pero se olvida de cambiar la otra. ¿Cómo es esa reducción de la cantidad de errores que se cometerían?if elsea 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).