在 Python Cloud Function 中引发异常并同时 return HTTP 错误代码的最佳方法
Best way to raise an exception and simultaneously return a HTTP error code in a Python Cloud Function
我在合并传达给我的两个要求时遇到了一些问题。
我最初的要求是处理我创建的 GCP Cloud Function 中的异常,以便将 JSON 数据插入 BigQuery。基本逻辑如下:
import json
import google.auth
from google.cloud import bigquery
class SomeRandomException(Exception):
"""Text explaining the purpose of this exception"""
def main(request):
"""Triggered by another HTTP request"""
# Instantiation of BQ client
credentials, your_project_id = google.auth.default(
scopes=["https://www.googleapis.com/auth/cloud-platform"]
)
client = bigquery.Client(credentials=credentials, project=your_project_id, )
# JSON reading
json_data: dict = request.get_json()
final_message: str = ""
table_name = "someTableName"
for row in json_data:
rows_to_insert: list = []
rows_to_insert.append(row["data"])
if rows_to_insert:
errors: list = client.insert_rows_json(
table_name, rows_to_insert, row_ids=[None] * len(rows_to_insert)
)
if errors == []:
final_message = f"\n{len(rows_to_insert)} row(s) successfully inserted in table\n"
else:
raise SomeRandomException(
f"Encountered errors while inserting rows into table: {errors}"
)
return final_message
(请注意,代码中还处理了其他异常,但我试图简化上述逻辑以便于分析)
然后我收到第二个要求,说除了引发异常外,我还必须 return 一个 HTTP 错误代码。我在另一个 Whosebug 中发现很容易 return 错误代码和一些消息。但是我还没有找到任何可以清楚地解释如何 return 该错误代码并同时引发异常的内容。据我所知,raise 和 return 是互斥的语句。那么,有什么解决方案可以优雅地将异常处理和HTTP错误结合起来吗?
下面的代码片段是否可以接受或者是否有更好的方法?我真的很困惑,因为异常应该使用 raise 而 HTTP 代码需要 return.
else:
return SomeRandomException(
f"Encountered errors while inserting rows into table: {errors}"
), 500
以 John 的评论为基础。您想在您拥有的代码中引发异常,然后将 try-except 添加到 catch/handle 异常和 return 错误。
class SomeRandomException(Exception):
# add custom attributes if need be
pass
try:
# your code ...
else:
raise SomeRandomException("Custom Error Message!")
except SomeRandomException as err:
# caught exception, time to return error
response = {
"error": err.__class__.__name__,
"message": "Random Exception occured!"
}
# if exception has custom error message
if len(err.args) > 0:
response["message"] = err.args[0]
return response, 500
更进一步,您还可以将 Cloud Logging 与 Python 根记录器集成,这样就在 return 错误之前,您还可以将错误记录到 Cloud Function 的日志中,例如所以:
logging.error(err)
这只会有助于日后更容易查询日志。
我在合并传达给我的两个要求时遇到了一些问题。
我最初的要求是处理我创建的 GCP Cloud Function 中的异常,以便将 JSON 数据插入 BigQuery。基本逻辑如下:
import json
import google.auth
from google.cloud import bigquery
class SomeRandomException(Exception):
"""Text explaining the purpose of this exception"""
def main(request):
"""Triggered by another HTTP request"""
# Instantiation of BQ client
credentials, your_project_id = google.auth.default(
scopes=["https://www.googleapis.com/auth/cloud-platform"]
)
client = bigquery.Client(credentials=credentials, project=your_project_id, )
# JSON reading
json_data: dict = request.get_json()
final_message: str = ""
table_name = "someTableName"
for row in json_data:
rows_to_insert: list = []
rows_to_insert.append(row["data"])
if rows_to_insert:
errors: list = client.insert_rows_json(
table_name, rows_to_insert, row_ids=[None] * len(rows_to_insert)
)
if errors == []:
final_message = f"\n{len(rows_to_insert)} row(s) successfully inserted in table\n"
else:
raise SomeRandomException(
f"Encountered errors while inserting rows into table: {errors}"
)
return final_message
(请注意,代码中还处理了其他异常,但我试图简化上述逻辑以便于分析)
然后我收到第二个要求,说除了引发异常外,我还必须 return 一个 HTTP 错误代码。我在另一个 Whosebug
下面的代码片段是否可以接受或者是否有更好的方法?我真的很困惑,因为异常应该使用 raise 而 HTTP 代码需要 return.
else:
return SomeRandomException(
f"Encountered errors while inserting rows into table: {errors}"
), 500
以 John 的评论为基础。您想在您拥有的代码中引发异常,然后将 try-except 添加到 catch/handle 异常和 return 错误。
class SomeRandomException(Exception):
# add custom attributes if need be
pass
try:
# your code ...
else:
raise SomeRandomException("Custom Error Message!")
except SomeRandomException as err:
# caught exception, time to return error
response = {
"error": err.__class__.__name__,
"message": "Random Exception occured!"
}
# if exception has custom error message
if len(err.args) > 0:
response["message"] = err.args[0]
return response, 500
更进一步,您还可以将 Cloud Logging 与 Python 根记录器集成,这样就在 return 错误之前,您还可以将错误记录到 Cloud Function 的日志中,例如所以:
logging.error(err)
这只会有助于日后更容易查询日志。