错误与异常
- 在程序中,如果我们不确定某段代码能否成功执行,往往这个地方就需要使用异常处理。
- 程序中的错误至少包括两种,一种是语法错误,另一种则是异常。
- Python 中常见的异常类型:
- NameError, TypeError, FileNotFoundError
- KeyError是指字典中的键找不到
如何处理异常
用 try 和 except 来处理异常问题
1
2
3
4
5
6
7
8try:
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')except block只接受与它相匹配的异常类型并执行,如果程序抛出的异常并不匹配,那么程序也会终止并退出。
想解决这种情况,第一种方法就是在except block中加入多种异常的类型,比如:
1
2
3
4
5
6
7
8try:
s = input('please enter two numbers separated by comma: ')
num1 = int(s.split(',')[0].strip())
num2 = int(s.split(',')[1].strip())
except (ValueError, IndexError) as err:
print('Error: {}'.format(err))
print('continue')或者这样写: except block 中只要有一个exception 类型与实际匹配即可。并在最后一个except block,声明其处理的异常类型是Exception。Exception是其他所有非系统异常的基类,能够匹配任意非系统异常,所以基本能够涵盖所有错误类型。
1
2
3
4
5
6
7
8
9
10
11
12try:
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))
except IndexError as err:
print('Index Error: {}'.format(err))
except Exception as err:
print('Other error: {}'.format(err))
print('continue')也可以在except后面省略异常类型,表示与任意异常相匹配(包括系统异常等):
1
2
3
4
5
6
7
8
9
10
11
12try:
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))
except IndexError as err:
print('Index Error: {}'.format(err))
except:
print('Other error')
print('continue')此外,当程序中存在多个except block时,最多只有一个except block会被执行。所以如果多个except声明的异常类型都与实际相匹配,那么只有最前面的except block会被执行,其他则被忽略。
- 异常处理中,还有一个很常见的用法是finally,经常和try、except放在一起来用。无论发生什么情况,finally block中的语句都会被执行,哪怕前面的try 和excep block中使用了return语句。
1
2
3
4
5
6
7
8
9
10import 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()