语法错误在代码运行之前必须手动解决, 否则代码无法运行. 这个不是我们要讨论的内容.
但是一些异常只有在特定的情况下才会发生, 程序必须有自动处理异常的能力.
下面就讨论如何处理运行时异常.
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)
