google-app-engine - 我如何捕捉 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
函数里面吗
解决方案
该PermanentTaskFailure
异常通常在任务执行或尝试执行时引发,因此您在创建任务时不会捕获它。除非,也许,如果您从另一个任务执行处理程序执行此操作,但在这种情况下,它将用于入队任务,而不是用于入队任务。或者,如果排队本身有麻烦?不确定 - 在这种情况下我从来没有得到它。
所以,充其量,我认为你可能能够从do_something_with_key()
. 但是您无法在所有情况下都捕获它 - 例如,如果任务代码无法执行 - 延迟库代码本身会捕获异常,请参阅Issue with appengine deferred tasks, execution throws unknown error中的示例。
我能够抓住它(同样,可能不是所有情况),但那是在我从deferred
库切换到直接使用推送任务之后(这是延迟库在后台使用的)。
您引用的文章PermanentTaskFailure
在处理程序代码的上下文中讨论(故意)引发异常以向延迟库发出信号,它不应该将任务的另一个副本排入队列 - 如果任务执行失败,默认情况下它会执行此操作(基于请求的返回码),直到达到最大重试次数。
推荐阅读
- laravel - 每个循环中是否有任何问题可以打破它而不是创建模型?
- python - 了解 FastText 多语言
- java - 从 RecyclerViewAdapter 启动 BottomSheet,该 RecyclerViewAdapter 与 onBindViewHolder 内的 RecyclerView.Adapter 一起扩展
- angular - 找不到模块:错误:无法解析“模块”
- java - pojo 对象类在 firebase 中插入重复值
- java - 如何处理h2数据库无法处理中断
- cakephp - 属于许多:保存自定义字段
- apache-kafka - 无法建立到节点 -1 的连接。经纪人可能不可用
- angular - 如何在考虑安全性的情况下处理 Angular 页面刷新
- ruby-on-rails - 设计和设计令牌身份验证 gem 路由错误