if条件语句和while循环语句可以嵌套使用,异常同样可以。下面演示一个基本的例子:
try:
f = open("1.txt","r")
try:
conent = f.read()
print(conent)
f.close()
except NameError as error:
print("错误:%s" % error)
except FileNotFoundError as error:
print("错误:%s" % error)
结果:
错误:[Errno 2] No such file or directory: '1.txt'
从以上的结果分析可以得出:代码在open()的时候就出错了,因此后面的代码不会执行,会直接执行与第一个try处于同一个代码块的except,正好这个异常的类型就是“FileNotFoundError”,因此这个异常被except成功捕获,结果就是这样。但是如果我们把上面代码中的两个异常类型调换一下位置,代码如下的时候,这个异常与指定的拦截类型不符合,就会被传递给Python解释器,最终由解释器来把程序终止。
try:
f = open("1.txt","r")
try:
conent = f.read()
print(conent)
f.close()
except FileNotFoundError as error:
print("错误:%s" % error)
except NameError as error:
print("错误:%s" % error)
结果:
f = open("1.txt","r")
FileNotFoundError: [Errno 2] No such file or directory: '1.txt'
下面再看一个传递的经典例子:
try:
f = open("1.txt","w")
try:
print(a)
except FileNotFoundError as error:
print("错误1:%s" % error)
except NameError as error:
print("错误2:%s" % error)
结果:
错误2:name 'a' is not defined
外层的try中,代码以写的方式打开一个文件,这没毛病。内层try中变量a不存在,此时出现异常。但是内层try指定的异常类型与实际发生的异常不符合,就会传递到外层的try,正好外层的try指定处理的异常类型就是实际发生的异常类型,因此结果如上所示。
总结:
异常代码块可以嵌套,当内层代码出现异常,但是指定的异常类型与实际不符合时就会向外层传递。若还不符合再向外层传递,如果最后还是没有找到指定的类型就会由Python解释器处理。
自定义异常就是定义一个类继承Exception类,然后在出错的位置手动使用raise抛出一个自定义的异常类对象。
class MyException(Exception):
pass
try:
phone_num = input("请输入手机号:")
if phone_num.isdecimal() is False:
#print("手机号码含非数字")
raise MyException("手机号码含非数字")
elif len(phone_num) != 11:
# print("手机号长度不够")
raise MyException("手机号长度不够")
except MyException as error:
print("提示:%s" % error)
结果:
请输入手机号:sgvsdfgsgsgsdgds
提示:手机号码含非数字
关键点: