python系列 - 异常处理
错误与异常
通常来说,程序中的错误至少包含两种:一种是语法错误,另一种则是异常
语法错误:代码不符合编程规范,无法被识别与执行
异常:程序语法正确且可以被执行,但执行过程中遇到错误,常见例子:ZeroDivisionError
、NameError
、TypeError
异常处理
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则会抛出异常
注意:
except block只接受与其匹配的异常类型并执行,若程序抛出的异常不匹配,那么程序同样也会终止并退出
还是上述代码,只输入1,程序就会直接终止并退出
直接在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')
或者,直接在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')
注意:
存在多个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中,通常放一些无论如何都要执行的语句
自定义异常
内置异常无法满足需求
让异常更加详细可读、增加一些异常类型的其他功能
(大多数情况下,内置异常就够用了)
异常使用场景
不确定某段代码能否成功执行,那么这里可以加上异常处理,比如:数据库连接、读取等