47

如果我运行代码:

connection = manager.connect("I2Cx")

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

但如果我这样做:

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

它不会为 e 打印任何内容。我希望能够打印抛出的异常。如果我尝试用除以零操作来做同样的事情,它在两种情况下都会被正确捕获和报告。我在这里想念什么?

4

7 回答 7

84

如果它引发一个没有消息的 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

...因为您可能不想处理KeyboardInterrupt用户按下 CTRL-C 或SystemExit-blocktry调用sys.exit().

于 2013-04-22T18:32:35.570 回答
20

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

try:
    connection = manager.connect("I2Cx")
except KeyError as e:
    print(e.message)
于 2018-10-17T13:50:04.683 回答
6

You should consult the documentation of whatever library is throwing the exception, to see how to get an error message out of its exceptions.

Alternatively, a good way to debug this kind of thing is to say:

except Exception, e:
    print dir(e)

to see what properties e has - you'll probably find it has a message property or similar.

于 2013-04-22T18:25:46.237 回答
2

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

connection = manager.connect.get("I2Cx")

KeyError如果密钥不存在,则不会引发 a 。

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

于 2015-05-05T12:10:56.897 回答
1

如果您不想只处理错误NoneType并使用get() 例如:

manager.connect.get("")
于 2016-11-11T04:01:23.003 回答
0

我不认为python有一个陷阱:)

try:
    connection = manager.connect("I2Cx")
except Exception, e:
    print e
于 2013-04-22T18:32:29.177 回答
-1

尝试 print(e.message) 这应该能够打印您的异常。

try:
    connection = manager.connect("I2Cx")
except Exception, e:
    print(e.message)
于 2017-12-15T19:50:58.123 回答