捕获 Firebase 503 错误异常未捕获我的 try 语句

Catch Firebase 503 error exception not caught my try statement

我正在使用 Firebase 实时数据库侦听器来侦听数据库路径上的更改。

我的程序最近崩溃了,因为下面的 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()

我想处理未来的 503 错误,但我不确定该怎么做。

此外,我使用上面的 except Exception as e 来达到 demo/debugging 的目的,但我也不确定 requests.exceptions.HTTPError 是否足够具体以捕获 500 个错误(尽管我不知道会引发什么其他错误)。

来自firebase_admin reference docs

This API is based on the event streaming support available in the Firebase REST API. Each call to listen() starts a new HTTP connection and a background thread. This is an experimental feature.

这里的关键是这一切都在后台线程中运行。因此,将对 listen() 的调用包装在 try/except 中将不会捕获线程中抛出的异常。没有简单的方法可以捕获后台线程中发生的异常。

要解决您的问题,您可能需要进一步了解数据库返回 HTTP 503 状态的原因。或者您将需要切换到其他一些 firebase_admin API 以允许您捕获并忽略这些异常。