¿Qué tiene de malo usar un simple ‘excepto’? [duplicate]

3 minutos de lectura

¿Que tiene de malo usar un simple excepto duplicate
caioramaglio

Intenté crear una función para verificar si se muestra una imagen en la pantalla usando PyAutoGui y se me ocurrió esto:

def check_image_on_screen(image):
    try:
        pyautogui.locateCenterOnScreen(image)
        return True
    except:
        return False

Y funciona bien, pero PyCharm me dice que no debería irme except desnudo. ¿Cuál es el problema de dejarlo así? ¿Hay una forma más apropiada de crear la misma función?

  • Consulte también stackoverflow.com/q/4990718/20670

    –Tim Pietzcker

    1 de marzo de 2019 a las 16:25

  • Wikipedia tiene buena información sobre esto, se llama ocultar errores.

    – John Szakmeister

    1 de marzo de 2019 a las 16:28

  • No estoy seguro de que esto sea un duplicado de eso. Esto es preguntar “¿Por qué no desnudar excepto?” mientras que uno pregunta “¿Cómo puedo desnudar excepto”. A bien la respuesta para el último probablemente responda al primero, pero eso no hace un duplicado.

    – Adam Smith

    1 de marzo de 2019 a las 16:30

Desnudo except detectará excepciones que seguramente no desea detectar, incluidas KeyboardInterrupt (el usuario presionando Ctrl+C) y errores generados por Python como SystemExit

Si no tiene una excepción específica que espera, al menos except Exceptionque es el tipo base para todas las excepciones “Normal”.


Dicho esto: usas except bloques para recuperarse de estados de falla conocidos. Un estado de falla desconocido generalmente es irrecuperable, y es comportamiento apropiado para salir fatalmente en esos estados, que es lo que el intérprete de Python hace naturalmente con una excepción no detectada.

Captura todo lo que sabes cómo manejar y deja que el resto se propague por la pila de llamadas para ver si algo más puede manejarlo. En este caso, el error que espera (por los documentos) es pyautogui.ImageNotFoundException

  • Un ejemplo en el que es posible que desee detectar todas las excepciones es cuando se utilizan bases de datos. Captura todo y haz un poco de limpieza.

    – Amit Tripathi

    5 de diciembre de 2019 a las 11:25

  • Creo que el multiprocesamiento es otro ejemplo, para evitar que los subprocesos atascados terminen adecuadamente el grupo.

    – Rómulo PBenedetti

    15/03/2020 a las 20:50

  • Ambos son ejemplos en los que es posible que desee utilizar try/finally en vez de try/except. Usar finalmente significa que puede garantizar la limpieza, pero la excepción aún se propagará después.

    – Óscar Benjamín

    19 mayo 2020 a las 22:09

  • @AdamSmith, de hecho, volvemos a intentar la notificación, pero sigue fallando. No quiero que eso detenga todo. Nos dimos cuenta de eso en la Gran falla de Slack de 2021, donde las implementaciones fallaban simplemente porque no podían enviar una notificación de Slack

    – Abdul Rahman Al Hamali

    5 de febrero de 2021 a las 19:05

  • @StressedBoi_69420 La excepción debería estar visible en el seguimiento de la pila. Por ejemplo, intenta hacer [][0] y observe que la pila dice “IndexError”, o {"ok":None}['nope'] y observe que la pila dice “KeyError”

    – Adam Smith

    5 de marzo a las 5:18

Básicamente, no estás aprovechando el idioma para ayudarte a encontrar problemas. si usaste except Exception as ex: podría hacer algo como registrar la excepción y saber exactamente qué sucedió.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad