我如何捕获PermanentTaskFailure

时间:2018-08-29 08:18:24

标签: google-app-engine

这是捕获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函数中

1 个答案:

答案 0 :(得分:2)

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

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

我能够捕获它(再次,可能不是在所有情况下都可以),但这是在我从deferred库切换为直接使用push任务之后(这是延迟库在后台使用的功能) )。

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