首页 > 解决方案 > 我如何捕捉 PermanentTaskFailure

问题描述

这是捕获 PermannentTask 失败的正确方法吗?(https://cloud.google.com/appengine/articles/deferred

def do_something_with_key(k):
    entity = k.get()
    # Do something with entity
    entity.put()

k = ndb.Key('MyModel', 123)
try:
   deferred.defer(do_something_with_key, k, _countdown=60)
except PermanentTaskFailure:
   #catch here 

或者我需要把 try/except 放在do_something_with_key函数里面吗

标签: google-app-engine

解决方案


PermanentTaskFailure异常通常在任务执行或尝试执行时引发,因此您在创建任务时不会捕获它。除非,也许,如果您从另一个任务执行处理程序执行此操作,但在这种情况下,它将用于入队任务,而不是用于入队任务。或者,如果排队本身有麻烦?不确定 - 在这种情况下我从来没有得到它。

所以,充其量,我认为你可能能够从do_something_with_key(). 但是您无法在所有情况下都捕获它 - 例如,如果任务代码无法执行 - 延迟库代码本身会捕获异常,请参阅Issue with appengine deferred tasks, execution throws unknown error中的示例。

我能够抓住它(同样,可能不是所有情况),但那是在我从deferred库切换到直接使用推送任务之后(这是延迟库在后台使用的)。

您引用的文章PermanentTaskFailure在处理程序代码的上下文中讨论(故意)引发异常以向延迟库发出信号,它不应该将任务的另一个副本排入队列 - 如果任务执行失败,默认情况下它会执行此操作(基于请求的返回码),直到达到最大重试次数。


推荐阅读