异常处理
Python当中处理异常的语句有四种
- try...except语句
- try...except...else语句
- try...except...finally语句
- 使用raise语句抛出异常
常见异常及描述
try...except
捕获异常执行相应的处理结果。
语法
try:
block1
except [Exception [as alias]]
block2
'''
Exception:指定要捕获的异常,默认处理所有异常。
as alias: 为当前异常指定别名。
'''
案例
#模拟幼儿园分苹果案例
def division():
print('='*10+'分苹果了'+'='*10)
apple = int(input('请输入苹果的个数:'))
children = int(input('请输入小朋友个数:'))
result = apple//children
remain = apple-result*children #计算余下的苹果数
if remain > 0:
print(apple,'个苹果,平均分给',children,'个小朋友,每个人分',result,'个,剩下',remain,'个')
else:
print(apple,'个苹果,平均分给',children,'个小朋友,每个人分',result,'个5')
if __name__ == '__main__':
division()
#这里除数为0会报错,小朋友跟苹果数为小数会报错。
上述main函数代码改为
if __name__ == '__main__':
try:
division()
except ZeroDivisionError:
print('\n出错了,小朋友个数不能为0')
except ValueError as ve:
print('\n出错了,苹果跟小朋友只能是整数',ve)
或者
if __name__ == '__main__':
try:
division()
except (ZeroDivisionError,ValueError) as e:
print('\n出错了',e)
try...except...else
语法
try:
block1
except [ExceptionName [as alias]]:
block2
else:
block3
'''
else:没有出现异常时才执行。
'''
案例
#将main改为如下
if __name__ == '__main__':
try:
division()
except (ZeroDivisionError,ValueError) as e:
print('\n出错了',e)
else:
print('分苹果顺利完成')
#else中的语句块在没有异常的时候才执行,如果抛出异常了则不执行。
try...except...finally
语法
try:
block1
except [ExceptionName [as alias]]:
block2
finally:
block3
'''
finally: 无论是否抛出异常都会执行,主要用于关闭文件等操作
'''
案例
if __name__ == '__main__':
try:
division()
except (ZeroDivisionError,ValueError) as e:
print('\n出错了',e)
finally:
print('程序执行完毕')
使用raise语句抛出异常
某个函数可能会产生异常,但不想在当前函数中处理这个异常时使用。
语法
raise [ExceptionName [(reason)]]
'''
如果省略所有参数,会把当前的错误原样抛出。
只写ExceptionName参数不写reason参数,抛出异常时不会附带描述信息
'''
案例
#模拟幼儿园分苹果案例
def division():
print('='*10+'分苹果了'+'='*10)
apple = int(input('请输入苹果的个数:'))
children = int(input('请输入小朋友个数:'))
#判断苹果的个数是否小于小朋友的个数
if apple < children:
raise ValueError('苹果太少了不够分...') #捕获传入值错误异常
result = apple//children
remain = apple-result*children #计算余下的苹果数
if remain > 0:
print(apple,'个苹果,平均分给',children,'个小朋友,每个人分',result,'个,剩下',remain,'个')
else:
print(apple,'个苹果,平均分给',children,'个小朋友,每个人分',result,'个5')
if __name__ == '__main__':
try:
division()
except (ZeroDivisionError,ValueError) as e:
print('\n出错了',e)
'''
out:
==========分苹果了==========
请输入苹果的个数:5
请输入小朋友个数:10
出错了 苹果太少了不够分...
'''
#可以看到使用raise会将抛出的错误信息替换为描述信息
不写描述信息时的结果
raise ValueError#捕获传入值错误异常
'''
out:
==========分苹果了==========
请输入苹果的个数:3
请输入小朋友个数:6
出错了
'''
不写所有参数的结果
raise #捕获传入值错误异常
'''
out:
==========分苹果了==========
请输入苹果的个数:3
请输入小朋友个数:4
Traceback (most recent call last):
File "E:/python/test.py", line 17, in <module>
division()
File "E:/python/test.py", line 8, in division
raise #捕获传入值错误异常
RuntimeError: No active exception to reraise
Process finished with exit code 1
'''
学习来自:《python从入门到项目实践》明日科技 第十八章
今天的学习是为了以后的工作更加的轻松!