Catch Firebase 503 исключение ошибки не пойман мой оператор try - PullRequest
0 голосов
/ 22 мая 2019

Я использую прослушиватель базы данных Firebase Realtime для прослушивания изменений в пути к базе данных.

Моя программа недавно потерпела крах из-за следующей ошибки 503, которая, кажется, возникла в базовой библиотеке requests:

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/threading.py", line 917, in _bootstrap_inner
    self.run()
  File "/usr/local/lib/python3.7/threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/local/lib/python3.7/site-packages/firebase_admin/db.py", line 123, in _start_listen
    for sse_event in self._sse:
  File "/usr/local/lib/python3.7/site-packages/firebase_admin/_sseclient.py", line 128, in __next__
    self._connect()
  File "/usr/local/lib/python3.7/site-packages/firebase_admin/_sseclient.py", line 112, in _connect
    self.resp.raise_for_status()
  File "/usr/local/lib/python3.7/site-packages/requests/models.py", line 940, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 503 Server Error: Service Unavailable for url: https://database_url...

Моя инициализация слушателя обернута в оператор try, поэтому я не уверен, почему это не было перехвачено, проглочено и повторено, как я ожидал:

def init_listener():
    try:        
        listener = firebase_admin.db.reference(db_path).listen(handle_change)

    except Exception as e:
        time.sleep(1)  # Retry in one second.
        init_listener()

IЯ хотел бы обработать будущие ошибки 503, но я не уверен, как это сделать.

Кроме того, я использую except Exception as e выше для демонстрации / отладки, но я также не уверен, будет ли requests.exceptions.HTTPError достаточно конкретным, чтобы поймать только 500 ошибок (хотя я не знаю, чтодругие ошибки могут возникнуть).

1 Ответ

2 голосов
/ 22 мая 2019

Из справочных документов firebase_admin :

Этот API основан на поддержке потоковой передачи событий, доступной в Firebase REST API. Каждый вызов listen () запускает новое соединение HTTP и фоновый поток. Это экспериментальная функция.

Ключевым моментом здесь является то, что все это выполняется в фоновом потоке. Следовательно, перенос вызова на listen() в try/except не будет перехватывать исключения, генерируемые в потоке. Нет простого способа отловить исключения, возникающие в фоновом потоке.

Чтобы решить вашу проблему, вам, вероятно, потребуется узнать больше о том, почему база данных возвращает статус HTTP 503. Или вам нужно будет переключиться на какой-то другой firebase_admin API, который позволит вам перехватывать и игнорировать эти исключения.

...