【问题标题】:Separating except portion of a try/except into a function将 try/except 的 except 部分分离到一个函数中
【发布时间】:2016-10-31 06:17:24
【问题描述】:

我有一个 try/except,我在代码中经常重复 except 部分。这让我相信最好将 except 部分分成一个函数。

下面是我的用例:

try:
  ...
except api.error.ReadError as e:
  ...
except api.error.APIConnectionError as e:
  ...
except Exception as e:
  ...

我将如何将这个逻辑分离成一个函数,这样我就可以做一些简单的事情:

try:
  ...
except:
  my_error_handling_function(e)

【问题讨论】:

  • 如何创建一个自定义错误类,这样您就可以捕获一种错误?
  • 如果处理方式相同,则不必单独捕获每个异常:except (api.error.ReadError, api.error.APIConnectionError, Exception) as e: 如果处理方式不同,请不要使用一个函数来处理所有异常。跨度>

标签: python try-except


【解决方案1】:

只要定义函数:

def my_error_handling(e):
    #Do stuff

...并传入exception对象作为参数:

try:
    #some code
except Exception as e:
    my_error_handling(e)

仅使用通用 Exception 类型将允许您拥有单个 except 子句并在处理函数中处理和测试不同的错误类型。

为了检查捕获的异常的名称,您可以通过以下方式获取它:

type(e).__name__

哪个会打印名字,比如ValueErrorIOError

【讨论】:

  • 我理解这部分,但我不确定 my_error_handling(e) 在我的 3 个用例的上下文中会是什么样子
  • @MichaelSmith 你只需做if 语句来检查if type(e).__name__ == 'ReadError'
  • 这就是我要找的!很快就会试一试。
【解决方案2】:

定义你的功能:

def my_error_handling(e):
    #Handle exception

按照你的建议去做:

try:
  ...
except Exception as e:
  my_error_handling_function(e)

您可以通过在函数中获取异常“e”的类型来处理逻辑。见:python: How do I know what type of exception occurred?

【讨论】:

  • 你尝试/除了不是 catch 没有分配任何值 e 传递,也没有指定任何 Exception 类型
  • 但此时 my_error_handling 函数如何知道为 3 种不同的异常情况执行什么逻辑?
  • @MichaelSmith 我更新了我的帖子以包含该检查
  • 抱歉,忘记包含 e 的定义。
【解决方案3】:

我建议重构您的代码,使 try/except 块仅出现在一个位置。

例如,具有 send() 方法的 API 类似乎是包含您在问题中描述的错误处理逻辑的合理候选者。

【讨论】:

    猜你喜欢
    • 2011-05-08
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    相关资源
    最近更新 更多