捕获 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 以允许您捕获并忽略这些异常。
我正在使用 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 以允许您捕获并忽略这些异常。