> 文章列表 > 关于python中try。。。except的用法小结

关于python中try。。。except的用法小结

嘿,Python爱好者们!今天我们来聊聊那个让人又爱又恨的 try...except 块儿。想象一下,你在写代码时,突然蹦出个错误,就像你的咖啡杯突然“跳”出桌面一样让人猝不及防。这时候,try...except 就派上用场了,它就像是你的代码的“安全网”。

问题来了: 为什么 except 子句的顺序这么重要?记住,Python 是按照你写的顺序来匹配异常的,就像你在餐厅点菜,先点先上。如果你把基类放在派生类前面,那派生类就永远轮不到“上菜”了。所以,聪明点,先处理具体的,再处理一般的。

更深入的问题: 异常除了能告诉我们“出错了”,还能做啥?答案是:异常可以带参数!就像你收到一封邮件,标题是“出错啦”,但内容才是关键。你可以通过 except Exception as inst: 来获取这些参数,然后分析、打印,甚至解包它们。

终极问题: try...except 块能不能捕获所有地方的异常?答案是不能。它只捕获在 try 块中直接发生的异常,或者在该块中调用的函数中发生的异常。这就好比你家的防盗门只能防贼从门进来,但如果他们从窗户爬进来,那就……

所以,下次当你在代码中使用 try...except 时,记住这些要点,让你的代码更健壮,避免那些意外“惊喜”。毕竟,谁不喜欢一个稳定可靠的代码世界呢?

关于python中try。。。except的用法小结

关于python中try。。。except的用法小结

如果except子句中的类是同一类或其基类,则该子句与异常兼容(但不是相反的方式-列出派生类的except子句与基类不兼容)。例如,以下代码将按此顺序打印B,C,D:

>>> class C(B):pass>>> class D(C):pass>>> for cls in [B,C,D]:try:raise cls()except D:print("D")except C:print("C")except B:print("B")B
C
D

发生异常时,它可能具有关联的值,也称为异常的参数。参数的存在和类型取决于异常类型。

except子句可以在异常名称后指定一个变量。变量绑定到带有存储在中的参数的异常实例 instance.args。为了方便起见,定义了异常实例, str()以便可以直接打印自变量而无需引用.args。人们也可以在引发异常之前先实例化异常,然后根据需要向其添加任何属性。

>>> try:
...     raise Exception('spam', 'eggs')
... except Exception as inst:
...     print(type(inst))    # the exception instance
...     print(inst.args)     # arguments stored in .args
...     print(inst)          # __str__ allows args to be printed directly,
...                          # but may be overridden in exception subclasses
...     x, y = inst.args     # unpack args
...     print('x =', x)
...     print('y =', y)
...
<class 'Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs

如果异常处理程序立即在try子句中发生,则异常处理程序不仅会处理异常,而且如果它们在try子句中被调用(甚至间接调用)的函数中发生,异常处理程序也不会处理异常。例如:

>>> def this_fails():x = 1/0>>> try:this_fails()except ZeroDivisionError as err:print('Handling run-time error:',err)Handling run-time error: division by zero

抛出异常

>>> raise NameError('HiThere')
Traceback (most recent call last):File "<pyshell#66>", line 1, in <module>raise NameError('HiThere')
NameError: HiThere
>>> raise ValueError
Traceback (most recent call last):File "<pyshell#67>"