Python APScheduler - 在回调方法中捕获引发的异常

Python APScheduler - Catching raised exceptions in callback method

我正在使用 Python APScheduler,我希望从回调方法中捕获引发的异常,但不确定如何执行此操作。到目前为止,我已经提供了我的代码,但是我仍然不知道如何正确地执行此操作。任何帮助将不胜感激。

import time
from apscheduler.schedulers.background import BackgroundScheduler


def expiry_callback():
    raise ValueError
    print("inside job")


sched = BackgroundScheduler(daemon=True)
sched.add_job(expiry_callback,'interval',seconds=1)

try:
    sched.start()
except ValueError as e:
    print(f'ran into an issue!! {e}')

try:
    while True:
        time.sleep(5)
except (KeyboardInterrupt, SystemExit):
    sched.shutdown()

堆栈跟踪:

/Users/me/Documents/environments/my_env/bin/python3.9 /Users/me/PycharmProjects/pythonProject2/run.py
Job "expiry_callback (trigger: interval[0:00:01], next run at: 2021-08-24 22:33:26 MDT)" raised an exception
Traceback (most recent call last):
  File "/Users/me/Documents/environments/my_env/lib/python3.9/site-packages/apscheduler/executors/base.py", line 125, in run_job
    retval = job.func(*job.args, **job.kwargs)
  File "/Users/me/PycharmProjects/pythonProject2/run.py", line 6, in expiry_callback
    raise ValueError
ValueError

Process finished with exit code 0

调用sched.start()只会启动执行回调函数的后台线程,但不会调用回调函数本身,因此它永远不会产生异常。

如果您希望以一致的方式处理回调函数的异常,您可以改为通过捕获给定异常并以明确方式输出错误的包装函数来调用:

# insert definition of expiry_callback before this line

def catch_exception(func, exception):
    def wrapper():
        try:
            func()
        except exception as e:
            print(f'ran into an issue!! {e}')
    return wrapper

sched = BackgroundScheduler(daemon=True)
sched.add_job(catch_exception(expiry_callback, ValueError),'interval',seconds=1)

sched.start()

# insert idle code after this line

演示:https://replit.com/@blhsing/BlueCreepyMethod