[英]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.