簡體   English   中英

來自完美任務的異常不能被 sys.excepthook 捕獲

[英]Exception from a prefect task cannot be caught by sys.excepthook

我為sys.excepthook設置了一個異常處理程序:

    def handle_exception(exc_type, exc_value, exc_traceback):
        if issubclass(exc_type, KeyboardInterrupt):
            logger.error("KeyboardInterrupt\n")
            sys.__excepthook__(exc_type, exc_value, exc_traceback)
            return

        # Preserve the exception info in the log.
        print("UNEXPECTED ERROR OCCURRED!")
        logger.error(
            "Uncaught exception", exc_info=(exc_type, exc_value, exc_traceback)
        )

        # Send the exception info to Slack.
        exc_text = (
            f"[Error] *{logger_name}* <@U01HX7R5VPW>\n```"
            + "".join(format_exception(exc_type, exc_value, exc_traceback))
            + "```"
        )
        notify(exc_text, critical=True)
    sys.excepthook = handle_exception

我有一個完美的流程運行如下:

with Flow("stocktwits-crawler", schedule=schedule) as f:
        print("Running...")
        if ...:
                a(...)
        else:
                b(...)
        logger.info("All finished.")

使用@task裝飾器添加了方法a()b()

我的問題是:如果在a()b()之外引發錯誤,我的異常處理程序可以捕獲消息並寫入日志文件。 但是,當在完美任務( a()b() )內部引發錯誤時,日志文件 output 沒有任何內容,這意味着異常處理程序不會捕獲錯誤消息。 我不確定prefect task是否有另一個用於異常處理程序的鈎子。 你能給我一些關於如何進一步調試這個問題的建議嗎?

一般來說,Prefect 管理您的流程和任務的 state,因此您不必構建自己的異常處理程序。 您是否知道 Prefect 擁有開箱即用的state 處理程序提供此功能? 是一個通過 Slack 消息發送完整異常回溯的示例。

此外,在 Prefect <= 1.0 中,您不能直接在流程中使用 if/else 語句,與 print 和 log 語句相同。 Flow 構造函數只能調用任務和設置依賴項。 這意味着您必須將此邏輯移動到可以用@task裝飾的單獨函數中。 您可以將 if/else 語句替換為條件任務,例如case

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM