如果作业任务在执行时发生了异常,那么可能会导致作业任务失败
那么,因为 RQ 工作进程是运行在后台的,我们又要如何得到这些异常的通知 ?
默认: 失败队列
当异常发生时,RQ 的默认处理机制是失败队列 ( failed
)
每个执行失败的作业任务以及其异常信息 ( 类型,值,回溯 ) 都会存储在此处
虽然这可以确保不会丢失失败的作业任务,但也无法主动获取关于作业任务执行失败的通知
为什么呢 ?
其实 RQ 只会简单的将执行失败的作业及相关信息静静的存放到失败队列,如果要获取失败的工作任务,还要自己去读取失败队列
自定义异常处理器
从版本 0.3.1
开始,RQ 支持注册自定义异常处理程序
这样就可以完全替换默认行为( 将作业任务发送到失败的队列 ),或者在发生异常时采取其它步骤
向 RQ 工作进程注册自定义的异常处理程序的方法如下
from rq.handlers import move_to_failed_queue # RQ 默认的异常处理器 w = Worker([q], exception_handlers=[my_handler, move_to_failed_queue]) ...
RQ 工作进程会向异常处理器传递以下参数 job
、exc_type
、exc_value
和 traceback
也就是说异常处理器的函数原型如下
def my_handler(job, exc_type, exc_value, traceback): # 一些自定义的处理逻辑 # 例如把异常写入数据库 ...
当然了,因为 Python 的特性,该异常处理器的函数原型还可以是
def my_handler(job, *exc_info): # 一些自定义的处理逻辑 ...
异常处理器链
RQ 支持异常处理器链,也就是说异常处理器本身负责决定是否完成异常处理,或者应该落到堆栈上的下一个处理程序
异常处理程序可以通过返回布尔值来指示这一点
False
表示停止处理异常True
表示继续并进入堆栈的下一个异常处理程序
对于实现者来说,有一点很重要,就是
默认情况下,当处理程序没有显式返回值 ( 因此为 None
) 时,将被解释为 True
,即继续使用下一个处理程序
如果想要替换默认的异常处理行为 ( 将作业任务移动到失败队列 ),自定义的异常处理器必须返回 False
,也就是停止处理异常
def black_hole(job, *exc_info): return False
目前尚无回复