Какой лучший способ получить сообщение об исключении: str (e) vs e.args [0]? - PullRequest
1 голос
/ 25 октября 2019

Рассмотрим случай, когда я выкидываю встроенное Exception с сообщением и при обработке я сохраняю сообщение об исключении. Я знаю, что могу сделать это двумя способами, как в примере ниже.

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

Есть ли какое-либо обоснование того, что один путь лучше другого?

1 Ответ

2 голосов
/ 25 октября 2019

Как правило, использование 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 модуль для получения дополнительных возможностей получения информации из ваших исключений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...