1

我已将异常处理程序设置为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.")

方法a()b()已与@task装饰器一起添加。

a()我的问题是:如果在and之外引发错误b(),我的异常处理程序可以捕获消息并写入日志文件。a()但是当在完美任务(和)内部引发错误时b(),日志文件不会输出任何内容,这意味着异常处理程序不会捕获错误消息。我不确定prefect task异常处理程序是否有另一个钩子。你能给我一些关于如何进一步调试这个问题的建议吗?

4

1 回答 1

1

一般来说,Prefect 管理您的流程和任务的状态,因此您不必构建自己的异常处理程序。您是否知道 Prefect 具有开箱即用地提供此功能的状态处理程序?是一个通过 Slack 消息发送完整异常回溯的示例。

此外,在 Prefect <= 1.0 中,您不能直接在流程中使用 if/else 语句,与 print 和 log 语句相同。Flow 构造函数只能调用任务和设置依赖项。这意味着您必须将此逻辑移动到可以用@task. 您可以将 if/else 语句替换为条件任务,例如case.

于 2021-12-21T12:30:58.703 回答