【问题标题】:How to catch exceptions from function that has been passed as an argument to another function如何从已作为参数传递给另一个函数的函数中捕获异常
【发布时间】:2018-01-12 04:08:38
【问题描述】:

我有一个调用 API 的库。

由于我正在调用的 API 的某些限制,我希望能够使用不同的凭据重试调用。

我将库函数传递给的函数中的所有内容都包含在内。

但是,当我尝试从调用中捕获任何异常时,没有捕获任何异常,我最终会退出代码和堆栈跟踪。

代码如下所示

import the_library

def making_the_call(api_call):
    try:
        api_call()
    except TheKeyExceptionIamLookingFor:
        # change creds and redo the call
    except OtherExceptionsICareAboutAndExpect:
        # Do other stuff to handle

making_the_call(the_library.some_api_call(the_args))

这是在 aws lambda 中运行的,所以我不知道这是否是导致此问题的原因。

我已经在 python 控制台中运行了类似的代码,它从带有参数的传递函数中很好地捕获了异常,但是这段代码只是退出并给了我一个堆栈跟踪,甚至显示了我正在寻找并计划捕获的确切异常。

【问题讨论】:

  • 看起来您正在调用some_api_call,然后将结果作为参数传递给making_the_call
  • @PatrickHaugh 这个想法已经闪过我的脑海,但是我的 google foo 在如何分别传递参数方面让我失望,因此我这样做了,你能给我一个例子或资源去阅读吗如何正确地做到这一点?
  • 这实际上是一个很好的问题,答案很简单。当我开始阅读它时,我并没有预料到。干得好。
  • 你试过except the_library.ExceptionYouAreLookingFor: 吗?我之前遇到过类似的问题,我试图捕捉ConnectionError,但它不会返回。原来我抓住了Requests.ConnectionError,因为它是导入模块中自己的特殊异常对象。
  • @Idlehands 我实际上是从库 from the_library.api_errors import TheExceptionIamLookingFor 中导入特定错误,所以这次不是这种情况,但对于将来看到这个问题的人来说,这是一件好事.

标签: python python-3.x exception-handling


【解决方案1】:

要单独传递所有内容,您会这样做

def make_call(api_call, *args, **kwargs):
    try:
        return api_call(*args, **kwargs)
    except SomeException:
        # change args and kwargs
        return make_call(api_call, *args, **kwargs)

make_call(the_library.some_api_call, 'apple', 1, 2, 3)

请注意some_api_call 后面缺少()make_call args 内部将是 listkwargs(关键字参数)将是 dict

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 2017-08-07
    • 2019-08-19
    • 1970-01-01
    • 2023-01-12
    相关资源
    最近更新 更多