Как я могу поймать PermanentTaskFailure - PullRequest
0 голосов
/ 29 августа 2018

Это правильный способ отловить ошибку 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 

Или мне нужно поставить попробовать / кроме как внутри do_something_with_key функция

1 Ответ

0 голосов
/ 29 августа 2018

Исключение PermanentTaskFailure обычно вызывается при выполнении или попытке выполнения задачи, поэтому вы не поймете ее при создании задачи. Если, возможно, если вы сделаете это из другого обработчика выполнения задачи, но в этом случае это будет для задачи постановки в очередь, а не для постановки задачи в очередь. Или, может быть, если у самого себя возникают проблемы? Не уверен - я никогда не получал это в таком случае.

Так что, в лучшем случае, я думаю, что может быть в состоянии поймать его из do_something_with_key(). Но вы не сможете перехватить его во всех случаях - например, если код задачи не выполняется - исключение отлавливается самим кодом отложенной библиотеки, см. Пример в Проблема с отложенными задачами appengine, броски выполнения неизвестная ошибка .

Мне удалось его поймать (опять же, вероятно, не во всех случаях), но это было после того, как я переключился с библиотеки deferred на непосредственное использование задач push (что и используется отложенной библиотекой под капотом).

В статье, на которую вы ссылались, обсуждается PermanentTaskFailure в контексте кода вашего обработчика (преднамеренно), поднимающего исключение для передачи в отложенную библиотеку того, что она не должна ставить в очередь еще одну копию задачи - что она и делает по умолчанию если выполнение задачи завершится неудачно (на основе кода возврата для запроса), пока не будет достигнуто максимальное количество повторных попыток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...