Catch KeyError в Python
Если я запустил код:
connection = manager.connect("I2Cx")
Программа вылетает из строя и сообщает о KeyError, потому что I2Cx не существует (он должен быть I2C).
Но если я это сделаю:
try:
connection = manager.connect("I2Cx")
except Exception, e:
print e
Он ничего не печатает для e. Я хотел бы иметь возможность распечатать исключение, которое было выбрано. Если я попытаюсь сделать то же самое с делением на нулевую операцию, он будет пойман и правильно сообщается в обоих случаях. Что мне здесь не хватает?
Ответы
Ответ 1
Если он поднимает KeyError без сообщения, он ничего не печатает. Если вы...
try:
connection = manager.connect("I2Cx")
except Exception, e:
print repr(e)
... вы, по крайней мере, получите имя класса исключения.
Лучшей альтернативой является использование нескольких блоков except
и только "улов" исключений, которые вы собираетесь обрабатывать...
try:
connection = manager.connect("I2Cx")
except KeyError, e:
print 'I got a KeyError - reason "%s"' % str(e)
except IndexError, e:
print 'I got an IndexError - reason "%s"' % str(e)
Есть допустимые причины, чтобы поймать все исключения, но вы должны почти всегда повторно поднимать их, если вы делаете...
try:
connection = manager.connect("I2Cx")
except KeyError, e:
print 'I got a KeyError - reason "%s"' % str(e)
except:
print 'I got another exception, but I should re-raise'
raise
... потому что вы, вероятно, не хотите обрабатывать KeyboardInterrupt
, если пользователь нажимает CTRL-C или SystemExit
, если try
-block вызывает sys.exit()
.
Ответ 2
Вам следует проконсультироваться с документацией о том, какая библиотека выбрасывает исключение, чтобы узнать, как получить сообщение об ошибке за исключениями.
В качестве альтернативы, хороший способ отладки этого типа состоит в том, чтобы сказать:
except Exception, e:
print dir(e)
чтобы увидеть, какие свойства e
есть - вы, вероятно, обнаружите, что у него есть свойство message
или подобное.
Ответ 3
Вы также можете попытаться использовать get()
, например:
connection = manager.connect.get("I2Cx")
который не будет поднимать a KeyError
, если ключ не существует.
Вы также можете использовать второй аргумент, чтобы указать значение по умолчанию, если ключ отсутствует.
Ответ 4
Я не думаю, что у python есть улов:)
try:
connection = manager.connect("I2Cx")
except Exception, e:
print e
Ответ 5
Если вы не хотите обрабатывать ошибку только NoneType
и используйте get()
например:.
manager.connect.get("")
Ответ 6
Попробуйте распечатать (e.message), это должно иметь возможность распечатать ваше исключение.
try:
connection = manager.connect("I2Cx")
except Exception, e:
print(e.message)