python系列 - 异常处理

错误与异常

通常来说,程序中的错误至少包含两种:一种是语法错误,另一种则是异常
语法错误:代码不符合编程规范,无法被识别与执行
异常:程序语法正确且可以被执行,但执行过程中遇到错误,常见例子:ZeroDivisionErrorNameErrorTypeError

异常处理

except

通常使用try...except来解决

# 默认输入两个整型数字
try:
    s = input('please enter two numbers separated by comma: ')
    num1 = int(s.split(',')[0].strip())
    num2 = int(s.split(',')[1].strip())
    ... 
except ValueError as err:
    print('Value Error: {}'.format(err))

print('continue')

若输入a,b则会抛出异常
image.png


注意:
except block只接受与其匹配的异常类型并执行,若程序抛出的异常不匹配,那么程序同样也会终止并退出


还是上述代码,只输入1,程序就会直接终止并退出
image.png
直接在except中声明异常类型,很难覆盖到所有异常类型,更通常的做法是在最后一个except中声明处理的异常是Exception
Exception是其他所有非系统异常的基类,可以匹配任意非系统异常

try:
    s = input('please enter two numbers separated by comma: ')
    num1 = int(s.split(',')[0].strip())
    num2 = int(s.split(',')[1].strip())
    ...
except Exception as err:
    print('Value Error: {}'.format(err))

print('continue')

image.png
或者,直接在except后省略异常类型,这表示与任意异常匹配(包括系统异常等

try:
    s = input('please enter two numbers separated by comma: ')
    num1 = int(s.split(',')[0].strip())
    num2 = int(s.split(',')[1].strip())
    ...
except :
    print('all error')

print('continue')

image.png


注意:
存在多个except block时,最多只有一个except block会被执行(若多个except声明的异常类型都与实际相匹配,那么只有最前面的except block会被执行)


finally

finally通常和try、except放在一起使用;finally中的语句都会被执行
举个栗子:文件读取

import sys
try:
    f = open('file.txt', 'r')
    .... # some data processing
except OSError as err:
    print('OS error: {}'.format(err))
except:
    print('Unexpected error:', sys.exc_info()[0])
finally:
    f.close()

即无论文件读取成功还是失败,finally中的语句——关闭文件流都会被执行!!!
finally中,通常放一些无论如何都要执行的语句

自定义异常

内置异常无法满足需求
让异常更加详细可读、增加一些异常类型的其他功能
(大多数情况下,内置异常就够用了)

异常使用场景

不确定某段代码能否成功执行,那么这里可以加上异常处理,比如:数据库连接、读取等

posted @ 2023-02-20 10:57  莫伊101  阅读(14)  评论(0编辑  收藏  举报