Подтвердить что ты не робот

Catch KeyError в Python

Если я запустил код:

connection = manager.connect("I2Cx")

Программа вылетает из строя и сообщает о KeyError, потому что I2Cx не существует (он должен быть I2C).

Но если я это сделаю:

try:
    connection = manager.connect("I2Cx")
except Exception, e:
    print e

Он ничего не печатает для e. Я хотел бы иметь возможность распечатать исключение, которое было выбрано. Если я попытаюсь сделать то же самое с делением на нулевую операцию, он будет пойман и правильно сообщается в обоих случаях. Что мне здесь не хватает?

4b9b3361

Ответ 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)