如果我运行这段代码:
connection = manager.connect("I2Cx")
程序崩溃并报告 KeyError,因为 I2Cx 不存在(应该是 I2C)。但如果我这样做:
try:
connection = manager.connect("I2Cx")
except Exception, e:
print e
对于e它不打印任何内容,我想能够打印抛出的异常。如果我尝试使用除零操作来做同样的事情,它会在两种情况下正确地捕获并报告。我在这里错过了什么?
如果引发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
(如果try
块调用sys.exit()
)。
catch
部分而不是实际打印...但是是的,这也解决了那个问题。 - Joran Beasleycatch
更可能是一个打字错误,因为如果在真正的代码中出现这种情况,OP 将会得到不同的错误。 - AyaKeyboardInterrupt
和SystemExit
不是Exception
的子类,所以你最后一句话有误导性。 - abarnertKeyboardInterrupt
和 SystemExit
,请捕获 BaseException
而不是 Exception
。这仍然不能处理裸字符串异常(或者一些您在解释器背后某种方式意外触发的不相关类型的异常——在C扩展模块中很容易发生错误,在纯Python中即使有意也不容易实现);为此,您确实需要使用裸 except
。 - abarnertValueError
,但0.89引发TypeError
或foo.FooError
时,我倾向于最常使用它。(另外两个选择是复制粘贴两个except
块,或者使用except Exception as e:
和if isinstance(e, (ValueError, TypeError)): raise
,或者无缘无故地要求foo-0.89或更高版本...) - abarnert我正在使用Python 3.6,用逗号将Exception和e分隔开无效。 我需要使用以下语法(仅供参考)
try:
connection = manager.connect("I2Cx")
except KeyError as e:
print(e.message)
您应该查看抛出异常的库的文档,以了解如何从其异常中获取错误消息。
或者,调试此类问题的一个好方法是执行以下操作:
except Exception, e:
print dir(e)
要查看e
有哪些属性 - 你很可能会发现它有一个message
属性或类似的属性。
您也可以尝试使用get()
方法,例如:
connection = manager.connect.get("I2Cx")
如果键不存在,使用这种方法不会引发KeyError
异常。
如果键不存在,您还可以使用第二个参数指定默认值。
manager.connect.get("")
我认为Python没有catch :)
try:
connection = manager.connect("I2Cx")
except Exception, e:
print e
try:
connection = manager.connect("I2Cx")
except Exception, e:
print(e.message)
except Exception as e:
代替except Exception, e:
。 - abarnert