es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Manejo de excepciones desde el script principal en Python.

Tengo un programa en Python. Hay varios scripts de Python que estoy llamando desde el script principal. Los otros scripts también están llamando a otros scripts. Pero todo ese proceso comienza en el script principal.

Cada función está separada en diferentes archivos, son importados con sys.path.append () y from aFolder import aFunction .

Este es un ejemplo con la pila de llamadas.

-mainScript
    -Llama a childScriptX ()
        -Llama a childScriptY ()
        -Llama a childScriptZ ()
        -Llama a ...
    -Llama a childScriptK ()

En algún lugar de estas llamadas, ocurren errores. Pero no pueden ser detectados desde el mainScript. Intenté envolver todo el mainScript con Try-Except pero eso no parece estar funcionando.

Imagino que cuando ocurre un error dentro de las funciones secundarias, la excepción no pasa al padre, por lo tanto, el error no se detecta y se rompe el programa.

Cada vez que el programa se rompe, simplemente lo reinicio manualmente, ese es el comportamiento que quisiera, pero solo para hacerlo automáticamente.
Los errores que ocurren son errores de solicitudes HTTP que sé de antemano que seguirán sucediendo. Pero no quiero atraparlos en el hijo sino en el padre.

Esa es la estructura que tengo ahora

-mainScript.py

while True:
    try:
        childScriptX ()
        childScriptZ ()
        ...
    except:
        ...

¿Algún sugerencia?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución aquí sería utilizar la función sys.excepthook. Esta función le permite manejar globalmente excepciones no capturadas en su aplicación Python, de modo que pueda personalizar cómo responde su programa a los errores.

    Aquí hay un ejemplo de cómo podría utilizar sys.excepthook para capturar errores de solicitud HTTP en sus scripts secundarios y manejarlos en el script principal:

    import sys
    import requests
    
    def handle_http_error(exctype, value, traceback):
        if issubclass(exctype, requests.exceptions.RequestException):
            # Este es un error de solicitud HTTP, manéjelo como desee
            print("Se produjo un error de solicitud HTTP:", value) # O alguna otra forma de registrar el error
        else:
            # Este es un tipo diferente de error, deje que ocurra el comportamiento predeterminado
            sys.__excepthook__(exctype, value, traceback)
    
    # Configure el excepthook a nuestra función personalizada
    sys.excepthook = handle_http_error
    
    # Ahora, en su script principal, puede llamar a sus scripts secundarios sin necesidad de usar un bloque try-except para capturar errores de solicitud HTTP
    from childScriptX import main as childScriptX_main
    
    if __name__ == '__main__':
        while True:
            childScriptX_main()
    

    En este ejemplo, definimos una función personalizada handle_http_error que verifica si la excepción es un error de solicitud HTTP (comprobando si es una subclase de requests.exceptions.RequestException). Si lo es, la manejamos como deseemos (en este caso, simplemente imprimiendo un mensaje). De lo contrario, dejamos que ocurra el comportamiento predeterminado llamando a sys.__excepthook__.

    Luego, configuramos esta función personalizada como el excepthook para toda la aplicación utilizando sys.excepthook = handle_http_error.

    Con esta configuración, cualquier error de solicitud HTTP no capturado en sus scripts secundarios será manejado por su función personalizada en el script principal, mientras que otros errores serán manejados por el comportamiento predeterminado.

    Tenga en cuenta que este enfoque supone que los errores de solicitud HTTP que está encontrando son todas subclases de requests.exceptions.RequestException, que es una clase base común para todas las excepciones relacionadas con solicitudes en la popular biblioteca requests. Si está utilizando una biblioteca HTTP diferente o encontrando otros tipos de errores que desea manejar globalmente, puede ajustar la función handle_http_error en consecuencia.

Comments are closed.