[英]Refactor try and Except codeblocks in Python
目前我的應用程序正在使用多個外部 API,這些函數可能會引發某種錯誤,我想了解各種情況並且不要使我的應用程序崩潰。 在下面的一段代碼中,您可以看到我使用 slack api 的函數(這只是一個示例,不是真正的示例),並且您可以看到我如何創建一個給出名稱和電子郵件的空間。 該函數可以返回多個錯誤,如 APIerror、TypeError...等
您還可以看到,該文件中的所有函數都可能引發一些錯誤,因此它使用 try 和 except 並盡量不要破壞我們的應用程序。 在except部分,我不想做任何特別的事情,只是返回錯誤或者我不知道,引發一個自定義錯誤。 如果出現問題,我可以將這項任務排入隊列,那么將來會很酷。
slack_client.py
def create_space():
try:
slack_api.create.space(spaceName='space name', email=emails)
except (...):
...
def delete_space():
try:
slack_api.delete.space(spaceId=space_id)
except (...):
...
我想重構 try 和 except 部分,因為我不想在所有 slack_client 類期間復制和粘貼 try 和 except,但是如果連接斷開或某些參數錯誤,“Slack”API 將給我一個錯誤。
我想過創建一個類,在 try 和 catch 中運行每個函數,但這有點奇怪,我會丟失參數部分,如“spaceName='space name'”,我認為它非常酷和清晰。
def execute_func(func, *args):
try:
func(args)
except (..):
...
所以想為這種情況提供一些幫助,因為處理外部 API 並不總是很容易......(目前使用 2 個外部 API)
在以前的生活中,我使用 VAX/VMS 並且仍然記得發現 LIB$SIG_TO_RET 將信號轉換為返回值時的極大樂趣。 您可以按照您指示的行在不多的 Python 行中執行完全相同的操作
def execute_func(func, *args, **kwargs):
try:
result = func( *args, **kwargs)
return (True, result)
except Exception as exc:
return ( False, exc)
用法
result = execute_func( func, a1, a2, ... k1=v1, k2=v2, ...)
if result[0]:
func_result = result[1] # if it's useful
...
else:
# it went wrong, deal with the exception
caught_exception = result[1]
print( caught_exception)
您可以捕獲拋出的任何異常並將其捕獲在變量中以記錄或引發。 您甚至可以提出自己的自定義異常。 這樣的事情應該工作:
首先創建您的例外:
class CustomSlackException(Exception):
pass
然后在您調用的 API 引發一些異常時引發它:
try:
slack_api.create.space(spaceName='space name', email=emails)
except Exception as e:
print(e)
raise CustomSlackException("Custom error message!")
現在您可以捕獲異常並根據需要處理它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.