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