赞
赏
在 Python 中,try 语句有三种形式,即 try - except 的形式, try - finally 的形式或者是 try - except - finally 的组合形式。一个 try 语句可以对应一个或多个 except 语句,但只能对应一个 finally 子句。
try:
# 需要检测异常的代码
except Exception:
# 处理异常的代码
将需要检测异常的代码放在 try 语句里面,如果发生异常,则将需要对异常处理的代码放在 exception 语句里。
try:
# 需要检测异常的代码
except Exception1:
# 处理异常的代码1
except Exception2:
# 处理异常的代码2
except Exception:
# 处理异常的代码
try 之后的 except 语句可以有任意多个,如果发生异常,那么 Python 解释器会挨个匹配这些异常,如果匹配成功,那么就不会继续执行下面的异常处理代码,如果全部匹配不成功,那么会终止程序的执行。
在使用多个 except 语句时,我们最好是按照异常的最小子类写在上面,依次往下书写异常的父类,不然,如果我们将父类写在子类的前面,那么子类永远不会触发到异常处理代码。比如:
try:
# 需要检测异常的代码
except BaseException:
# 处理异常的代码1
except Exception:
# 处理异常的代码2
except ArithmeticError:
# 处理异常的代码
如果,我们这样首先抓取 BaseException 异常,接着抓取 Exception 异常,最好再抓取 ArithmeticError 异常,那么这样,Exception 异常和 ArithmeticError 异常永远不会触发,因为所有的异常都属于 BaseException ,因此所有的异常都会匹配到 BaseException 的异常处理代码,因为,我们应该按照如下的方式书写:
try:
# 需要检测异常的代码
except ArithmeticError:
# 处理异常的代码1
except Exception:
# 处理异常的代码2
except BaseException:
# 处理异常的代码3
这样,我们按照从异常的子类,不断的写到异常的父类的方式来书写异常类才是正确的。
try:
# 需要检测异常的代码
except (exception1, exception2):
# 处理异常的代码1
except Exception3:
# 处理异常的代码2
except Exception4:
# 处理异常的代码3
如果我们需要同时捕获多个异常,并且多个异常的处理逻辑是一样的,那么我们可以使用 () 的形式来缩写。
使用 Python try except 捕获异常
if __name__ == '__main__':
print("嗨客网(www.haicoder.net)")
num = input("Please input a number:")
print("Your input is:", int(num))
程序运行后,控制台输出如下:
我们在 main 函数里,使用 input 让用户输入,接着,我们将用户输入的 字符串 进行了 强制类型转换,转换成了 int 类型。
因为,我们输入的就是一个数字,因此,这里的转换成功,程序运行正常,现在,我们输入一个不是数字的字符串,程序运行后,控制台输出如下:
这次,我们输入的不是数字,而是一个字符串,这次将字符串转换成数字转换失败,因此,程序报出了异常,程序被异常终止,我们使用 try except 来捕获该异常,将代码修改如下:
if __name__ == '__main__':
print("嗨客网(www.haicoder.net)")
try:
num = input("Please input a number:")
print("Your input is:", int(num))
except Exception:
print("convert to number error")
程序运行后,控制台输出如下:
我们看到,这次,我们同样输入了字符串,将字符串转换成数字转换失败,但是这次程序没有报错,因为,我们使用 try except 捕获了异常,因此,程序走到了 except 的逻辑。
使用 Python try 多个 except 语句捕获异常
if __name__ == '__main__':
print("嗨客网(www.haicoder.net)")
try:
num = input("Please input a number:")
print("Your input is:", int(num))
except BaseException:
print("convert to number error in BaseException")
except Exception:
print("convert to number error in Exception")
程序运行后,控制台输出如下:
我们在一个 try 语句后面,接了两个 except 语句,第一个 except 语句捕获的是 BaseException 异常,第二个 except 语句捕获的是 Exception 异常。
从异常 继承 关系来看,BaseException 是 Exception 类的父类,因此我们出发的异常虽然属于 Exception ,也同时属于 BaseException ,但由于 BaseException 写在第一个,因此匹配了 BaseException 的处理代码,Exception 的逻辑不再触发。现在,我们将代码修改如下:
if __name__ == '__main__':
print("嗨客网(www.haicoder.net)")
try:
num = input("Please input a number:")
print("Your input is:", int(num))
except Exception:
print("convert to number error in Exception")
except BaseException:
print("convert to number error in BaseException")
程序运行后,控制台输出如下:
我们看到,这次,只触发了 Exception 异常,没有触发 BaseException 异常。
当含有多个 except 语句时,会挨个匹配异常逻辑
if __name__ == '__main__':
print("嗨客网(www.haicoder.net)")
try:
num = input("Please input a number:")
print("Your input is:", int(num))
except ArithmeticError:
print("convert to number error in ArithmeticError")
except AttributeError:
print("convert to number error in AttributeError")
except ValueError:
print("convert to number error in ValueError")
except Exception:
print("convert to number error in Exception")
程序运行后,控制台输出如下:
我们在一个 try 语句后面,接了多个 except 语句,这里,我们输入了错误的值,将数字类型写成了字符串类型,因此,第一个 ArithmeticError 和第二个 AttributeError 都不会触发,因为,触发的类型不是这两种异常。
这里匹配成功的异常,其实就是 ValueError,因此匹配 ValueError 异常成功,因此执行了 ValueError 的异常处理代码,因为 ValueError 的异常已经匹配成功,所以 Exception 异常不会再继续匹配。
在 Python 中,try 语句有三种形式,即 try - except 的形式, try - finally 的形式或者是 try - except - finally 的组合形式。一个 try 语句可以对应一个或多个 except 语句,但只能对应一个 finally 子句。