Python学习第16天:Python 错误和异常[2]

130 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情 >>

基类

如果发生的异常和 except 子句中的类是同一个类或者是它的基类,则异常和 except 子句中的类是兼容的(但反过来则不成立 --- 列出派生类的 except 子句与基类兼容)。

实例
class BException(Exception):  #继承Exception基类
    pass

class CException(BException):  #继承BException基类
    pass

class DException(CException):  #继承CException基类
    pass

for cls in [BException, CException, DException]:
    try:
        raise cls()  #抛出异常
    except DException:
        print("D")
    except CException:
        print("C")
    except BException:
        print("B")

#输出
B
C
D

请注意如果 except 子句被颠倒(把 except BException 放到第一个),它将打印 B,B,B --- 因为DException类继承CException类,CException类继承BException类,将 except BException 放到第一个可以匹配这三个异常,后面的 except 就不会执行。

不带异常类型的 except

Python可以在所有 except 的最后加上 except 子句,这个子句可以省略异常名,以用作通配符。它可以捕获前面任何 except (如果有的话)没有捕获的所有异常。

try:
    statement(s)            # 要检测的语句块
except exception:
    deal_exception_code # 如果在 try 部份引发了 'exception' 异常
except :
    deal_all_other_exception2_code # 处理全部其它异常
else:
    no_exception_happend_code #如果没有异常发生
实例
try:
    raise BException()  #抛出异常
except DException:
    print("D")
except:
    print("处理全部其它异常") #处理全部其它异常

#输出
处理全部其它异常

except 语句捕获多种异常类型

一个 try 语句可能有多个 except 子句,以指定不同异常的处理程序,最多会执行一个处理程序。处理程序只处理相应的 try 子句中发生的异常,而不处理同一 try 语句内其他处理程序中的异常。一个 except 子句可以将多个异常命名为带括号的元组。

try:
    statement(s)            # 要检测的语句块
except exception:
    deal_exception_code # 如果在 try 部份引发了 'exception' 异常
except (Exception1[, Exception2[,...ExceptionN]]]) :
    deal_all_other_exception2_code # 处理多个异常
else:
    no_exception_happend_code #如果没有异常发生
实例
try:
    raise BException()  #抛出异常
except (BException, DException):
    print("D")
except:
    print("处理全部其它异常") #处理全部其它异常
else:
    print("没有异常发生") #没有异常发生

#输出
D

try - finally 语句

finally 语句用于无论是否发生异常都将执行最后的代码。

try:
    # <语句>
finally:
    # <语句>    #退出try时总会执行
实例
try:
    raise BException()  #抛出异常
except (BException, DException):
    print("D")
except:
    print("处理全部其它异常") #处理全部其它异常
else:
    print("没有异常发生") #没有异常发生
finally:
    print("你们绕不过我,必须执行") #必须执行的代码
    
#输出
D
你们绕不过我,必须执行

这里注意 finally 和 else 的区别,finally 是无论是否有异常都会执行,而 else 语句只有没有异常时才会执行。也就是说如果没有异常,那么 finally 和 else 都会执行。