簡體   English   中英

在 Python 中重構 try 和 except 代碼塊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM