在Python中捕获KeyError

2024-10-05 14:27:45 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我运行代码:

connection = manager.connect("I2Cx")

程序崩溃并报告一个密钥错误,因为I2Cx不存在(它应该是I2C)。

但如果我这样做了:

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

它不会为e打印任何内容。我希望能够打印引发的异常。如果我用除以零的操作尝试相同的操作,那么在这两种情况下都会捕获并正确报告。我错过了什么?


Tags: 代码程序内容报告connect错误exception密钥
3条回答

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

或者,调试这种东西的一个好方法是说:

except Exception, e:
    print dir(e)

要查看e有什么属性,您可能会发现它有一个message属性或类似的属性。

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

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;如果try-块调用sys.exit(),您可能也不想处理SystemExit

我使用的是Python 3.6,在Exception和e之间使用逗号不起作用。我需要使用以下语法(只是为任何想知道的人)

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

相关问题 更多 >