在Python中捕获KeyError

时间:2013-04-22 18:23:09

标签: python try-catch except

如果我运行代码:

connection = manager.connect("I2Cx")

程序崩溃并报告KeyError,因为I2Cx不存在(它应该是I2C)。

但如果我这样做:

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

它不会为e打印任何内容。我希望能够打印抛出的异常。如果我尝试使用除零操作来执行相同操作,则会在两种情况下都正确捕获并报告。我在这里缺少什么?

7 个答案:

答案 0 :(得分:53)

如果它在没有消息的情况下引发KeyError,那么它将不会打印任何内容。如果你这样做......

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

...你至少会得到异常类名。

更好的选择是使用多个except块,并且只“捕获”您打算处理的异常......

try:
    connection = manager.connect("I2Cx")
except KeyError as e:
    print 'I got a KeyError - reason "%s"' % str(e)
except IndexError as e:
    print 'I got an IndexError - reason "%s"' % str(e)

有正当理由可以捕获所有异常,但如果你这样做,你应该几乎总是重新提升它们。

try:
    connection = manager.connect("I2Cx")
except KeyError as e:
    print 'I got a KeyError - reason "%s"' % str(e)
except:
    print 'I got another exception, but I should re-raise'
    raise

...因为如果用户按下CTRL-C,您可能不想处理KeyboardInterrupt,如果SystemExit - 阻止调用try,则不希望处理sys.exit()

答案 1 :(得分:14)

我正在使用Python 3.6,并且在Exception和e之间使用逗号不起作用。我需要使用以下语法(仅对任何想知道的人有用)

try:
    connection = manager.connect("I2Cx")
except KeyError as e:
    print(e.message)

答案 2 :(得分:5)

您应该查阅抛出异常的任何库的文档,以了解如何从异常中获取错误消息。

或者,调试此类事情的好方法是:

except Exception, e:
    print dir(e)

查看e有哪些属性 - 您可能会发现它具有message属性或类似属性。

答案 3 :(得分:2)

您也可以尝试使用get(),例如:

KeyError

如果密钥不存在,则不会提出Person

如果密钥不存在,您也可以使用第二个参数指定默认值。

答案 4 :(得分:0)

我不认为python有一个问题:)

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

答案 5 :(得分:0)

如果您不想仅仅NoneType处理错误并使用get() e.g:

manager.connect.get("")

答案 6 :(得分:0)

尝试打印(e.message)这应该能够打印您的例外。

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