python异常处理机制的底层实现
要了解try except异常处理的⽤法,简单来说,当位于 try 块中的程序执⾏出现异常时,会将该种异常捕获,同时到对应的 except 块处理该异常,那么这⾥就有⼀个问题,它是如何到对应的 except 块的呢?
我们知道,⼀个 try 块也可以对应多个 except 块,⼀个 except 块可以同时处理多种异常。如果我们想使⽤⼀个 except 块处理所有异常,就可以这样写:
try:
#...
except Exception:
#...
这种情况下,对于 try 块中可能出现的任何异常,解释器都会交给仅有的这个 except 块处理,因为它的参数是 Exception,表⽰可以接收任何类型的异常。
注意,对于可以接收任何异常的except来说,其后可以跟 Exception,也可以不跟任何参数,但表⽰的含义都是⼀样的。
这⾥就要详细介绍⼀下 Exception。要知道,为了表⽰程序中可能出现的各种异常,Python 提供了⼤量的异常类,这些异常类之间有严格的继承关系,图 1 显⽰了 Python 的常见异常类之间的继承关系。
从图 1 中可以看出,BaseException 是 Python 中所有异常类的基类,但对于我们来说,最主要的是 Exception 类,因为程序中可能出现的各种异常,都继承⾃ Exception。
因此,如果⽤户要实现⾃定义异常,不应该继承 BaseException ,⽽应该继承 Exception 类。关于如何⾃定义⼀个异常类,可阅读《Python⾃定义异常类》⼀节。
当 try 块捕获到异常对象后,Python 解释器会拿这个异常类型依次和各个 except 块指定的异常类进⾏⽐较,如果捕获到的这个异常类,和某个 except 块后的异常类⼀样,⼜或者是该异常类的⼦类,那么 Python 解释器就会调⽤这个 except 块来处理异常;反之,Python 解释器会继续⽐较,直到和最后⼀个 except ⽐较完,如果没有⽐对成功,则证明该异常⽆法处理。
图 2 演⽰了位于 try 块中的程序发⽣异常时,从捕获异常到处理异常的整个流程。
下⾯看⼏个简单的异常捕获的例⼦:
try:
a = int(input("输⼊ a:"))
b = int(input("输⼊ b:"))
print( a/b )
except ValueError:
print("数值错误:程序只能接收整数参数")
except ArithmeticError:
print("算术错误")
except Exception:
print("未知异常")
该程序中,根据⽤户输⼊ a 和 b 值的不同,可能会导致 ValueError、ArithmeticError 异常:
1. 如果⽤户输⼊的 a 或者 b 是其他字符,⽽不是数字,会发⽣ ValueError 异常,try 块会捕获到该类型异常,同时 Python 解释器会调⽤
第⼀个 except 块处理异常;python的try和except用法
2. 如果⽤户输⼊的 a 和 b 是数字,但 b 的值为 0,由于在进⾏除法运算时除数不能为 0,因此会发⽣ ArithmeticError 异常,try 块会捕获
该异常,同时 Python 解释器会调⽤第⼆个 except 块处理异常;
3. 当然,程序运⾏过程中,还可能由于其他因素出现异常,try 块都可以捕获,同时 Python 会调⽤最后⼀个 except 块来处理。
当⼀个 try 块配有多个 except 块时,这些 except 块应遵循这样⼀个排序规则,即可处理全部异常的 except 块(参数为 Exception,也可以什么都不写)要放到所有 except 块的后⾯,且所有⽗类异常的 except 块要放到⼦类异常的 except 块的后⾯。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。