语法错误在代码运行之前必须手动解决, 否则代码无法运行. 这个不是我们要讨论的内容.
但是一些异常只有在特定的情况下才会发生, 程序必须有自动处理异常的能力.
下面就讨论如何处理运行时异常.
python 提供了使用try...except...
机制来处理异常.
try...except...
基本使用
语法:
try:
# python有可能出现异常的语句
except: 异常类型:
# 出现异常时的处理语句
需求:
我们需要从键盘输入一个整数, 如果输入的不是整数就一直输入下去.
while True:
try:
x = int(input("请输入一个整数:"))
break
except ValueError:
print("你输入的不是一个整数, 请重新输入!")
print("你输入的整数是:", x)
执行流程说明:
循环执行之后, 首先执行
try
语句.(就是指的Try
和except
之间的语句)如果执行的过程中没有发生任何异常, 则会把
Try
语句执行完毕, 跳过except
语句.如果执行的过程中出现了异常, 出现异常语句后面的语句则不会再执行.
根据发生的异常类型去匹配
except
的后面的类型, 如果匹配成功, 则开始执行这个except
语句
多个except
语句
一个Try
语句可以包含多个except
语句, 每个except
语句分别处理不同的异常, 但是至多只会有一个except
语句执行.
while True:
try:
x = int(input("请输入一个整数:"))
break
except ValueError:
print("你输入的不是一个整数, 请重新输入!")
except TypeError:
print("类型错误!")
print("你输入的整数是:", x)
一个except
包含多个异常类型
一个except
可以包含多个异常.
except (RuntimeError, TypeError, NameError):
pass
except
通配符
except
也可以省略后面的异常名, 表示通配符. 如果前面的异常类都捕捉不到发生的异常,则这个异常就会起作用.
while True:
try:
x = int(input("请输入一个整数:"))
print(x / 0)
break
except ValueError:
print("你输入的不是一个整数, 请重新输入!")
except:
print("未知异常!")
print("你输入的整数是:", x)
else
语句
python语言的异常处理相比其他语言一个特点是: 可以带有else
语句.
else
语句必须在所有的except
语句之后.
当没有任何异常发生的时候, 会执行else
语句.
while True:
try:
x = int(input("请输入一个整数:"))
except ValueError:
print("你输入的不是一个整数, 请重新输入!")
except:
print("未知异常!")
else:
print(x)
break
使用 else
子句比在 try
子句中附加代码要好,因为这样可以避免 try ... except
意外的截获本来不属于它们保护的那些代码抛出的异常。
finally
语句
还可以在最后添加一个可选的finally
语句.
finally
语句表示不管是否发生异常, 都会执行的语句.
finally
必须添加在最后, 如果有else
也要放在else
的后面.
try:
# a = 1 / 0
pass
except ZeroDivisionError as exceptObj:
print("except:发生异常的时候执行", exceptObj)
else:
print("else:我在没有发生异常的时候执行")
finally:
print("finally:我总是会执行")
由于finally
语句不管是否发生异常总是执行, 所以finally
语句中总是用作去释放已经打开的资源. 比如打开的文件, 应该在这里把文件关闭.
异常对象
在异常名之后, 也可以为except
指定一个变量, 这个变量绑定产生的那个异常对象.
try:
a = 1 / 0
except ZeroDivisionError as exceptObj:
print(exceptObj)