异常处理

Python当中处理异常的语句有四种

  1. try...except语句
  2. try...except...else语句
  3. try...except...finally语句
  4. 使用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从入门到项目实践》明日科技 第十八章
posted @ 2020-12-09 20:37  努力吧阿团  阅读(77)  评论(0编辑  收藏  举报