基础语法
异常是Python对象,表示一个错误。所以,Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。
try:
正常操作
except <异常类型A>:
发生异常,执行这块代码 #如果在try部份引发了异常类型A
except <异常类型B>,<数据>:
发生异常,执行这块代码 #如果引发了异常类型B,并获得附加的数据
else:
如果没有异常执行这块代码 #如果没有异常发生
finally:
退出try时总会执行
异常捕获与处理
我们来看一个简单的示例:
需求:
1.提示用户输入一个整数
2.使用8来除以用户输入的数
try:
num = int(input('请输入一个整数: '))
result = 8 / num
except ValueError:
print('输入的值不是合法的整数')
except ZeroDivisionError:
print('0不能做除数')
except Exception as r:
print('未知错误 %s' %(r))
else:
print('结果是:',result)
finally:
print('运行结束...')
结果:
1.正确结果:
2.异常处理:
主动抛出异常
关于主动抛出异常,这里需要使用raise
来定义异常类型即抛出内容。
示例:
需求: 提示用户输入密码 如果长度小于8位就抛出异常
def input_passwd():
passwd = input('请输入密码:')
if len(passwd) >= 8:
return passwd
print('主动抛出异常:')
raise Exception('长度小于8位')
try:
input_passwd()
except Exception as EC:
print(EC)
结果:
总结
- except语句不是必须的,finally语句也不是必须的,但是二者必须要有一个,否则就没有try的意义了。
- except语句可以有多个,Python会按except语句的顺序依次匹配你指定的异常,如果异常已经处理就不会再进入后面的except语句。
- except语句可以以元组形式同时指定多个异常,参见实例代码。
except (ZeroDivisionError, TypeError) as e:
-
except语句后面如果不指定异常类型,则默认捕获所有异常,你可以通过logging或者sys模块获取当前异常。
-
如果要捕获异常后要重复抛出,请使用raise,后面不要带任何参数或信息。
-
不建议捕获并抛出同一个异常,请考虑重构你的代码。
-
不建议在不清楚逻辑的情况下捕获所有异常,有可能你隐藏了很严重的问题。
-
尽量使用内置的异常处理语句来 替换try/except语句,比如
with
语句,getattr()
方法。