0

目前我的应用程序正在使用几个外部 API,这些函数可能会引发某种错误,我想了解各种情况,不要让我的应用程序崩溃。在下面的代码中,您可以看到我的函数,使用 slack api(这只是一个示例,不是真实示例),您可以看到我是如何创建一个提供姓名和电子邮件的空间。该函数可以返回几个错误,如 APIerror、TypeError...等

您还可以看到,该文件中的所有函数都可能引发一些错误,因此它使用 try 和 except 并尽量不要破坏我们的应用程序。在 except 部分,我不想做任何特别的事情,只是返回错误或者我不知道,引发自定义错误。如果出现问题,如果我可以将该任务排入队列,那么将来会很酷。

松弛客户端.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)

4

2 回答 2

1

在以前的生活中,我使用过 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)
于 2020-02-19T16:35:20.587 回答
0

您可以捕获任何引发的异常并将其捕获到变量中以记录或引发。您甚至可以提出自己的自定义异常。像这样的东西应该工作:

首先创建您的异常:

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!")

现在您可以捕获您的异常并根据需要进行处理。

于 2020-02-19T16:10:06.507 回答