【问题标题】:Which is better way to get exception message: str(e) vs e.args[0]?获取异常消息的更好方法是:str(e) vs e.args[0]?
【发布时间】:2019-10-25 09:20:18
【问题描述】:

让我们考虑一个情况,我抛出内置的Exception with message 并且在处理它时我存储异常消息。我知道我可以通过以下两种方式做到这一点。

try:
    raise Exception('some message')
except Exception as e:
    value_str = str(e)
    value_args = e.args[0]

有没有理由认为一种方法比另一种更好?

【问题讨论】:

  • args 已经初始化,那么没有问题,但如果它没有初始化,那么它会引发索引错误。但 value_str 并非如此。

标签: python python-3.x exception


【解决方案1】:

通常,使用str(e) 会更安全,因为在某些情况下e.args[0] 会引发索引错误:

try:
    raise Exception()
except Exception as e:
    value = e.args[0]

>>> IndexError: tuple index out of range

在某些情况下,第一个参数实际上不是消息,而 str(e) 只是调用应该总是返回消息的 e.__str__()

但是,在您的具体情况下,使用 e.args[0] 似乎要快一些:

import timeit


def test_args():
    try:
        raise Exception('some message')
    except Exception as e:
        value = e.args[0]


def test_str():
    try:
        raise Exception('some message')
    except Exception as e:
        value = str(e)


print(timeit.timeit('test_args()', setup='from __main__ import test_args'))
print(timeit.timeit('test_str()', setup='from __main__ import test_str'))

>>> 0.5408027
>>> 0.5728966000000001

如果执行速度的最小提升很重要,并且您确定e 始终至少有一个参数,请选择e.args[0]。在捕获特定类型的异常时,您还可以考虑直接访问属性。在所有其他情况下,我建议使用str(e)

有关从您的异常中检索信息的更多选项,请参阅traceback module

【讨论】:

  • 我在问这个具体案例。在我确定有参数传递给异常的地方,我在意识到它的情况下检索它。这没有回答我的问题。
  • 由于您提出问题的方式,我正在考虑更一般的情况。我编辑了我的答案以包括您的具体情况。如果您还需要更多信息,请告诉我。
  • 性能考虑是如此之小以至于无关紧要。我会考虑直接访问自定义异常类的属性,但是对于任何第 3 方/内置异常,根本没有 API 保证可以依赖,所以 str 看起来是唯一安全和理智的选择。
  • 因为似乎没有人可以对这个问题添加任何其他内容,我以受控方式使用异常,我将使用e.args[0]。没有文档说明反对此解决方案的任何论据,在这种情况下,性能的小幅提升似乎是有效的优势。感谢 @Jonathan 和 @deceze 的贡献。
猜你喜欢
  • 2015-02-15
  • 2012-10-08
  • 2014-06-14
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
相关资源
最近更新 更多