try - except 语句
try:
检测范围
except Exception[as reason]:
出现异常后的处理代码
try 语句按照如下方式工作:
首先,执行try子句(在关键字try和关键字except之间的语句)
如果没有异常发生,忽略except子句,try子句执行后结束。
如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和except之后的名称相符,那么对应的except子句将被执行。最后执行try - except语句之后的代码。
如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。
【例子】
1
try:
2
f = open('test.txt')
3
print(f.read())
4
f.close()
5
except OSError:
6
print('打开文件出错')
7
8
打开文件出错
打开文件出错
【例子】
1
try:
2
f = open('test.txt')
3
print(f.read())
4
f.close()
5
except OSError as error:
6
print('打开文件出错\n原因是:' + str(error))
7
8
打开文件出错
9
原因是:[Errno 2] No such file or directory: 'test.txt'
打开文件出错
原因是:[Errno 2] No such file or directory: 'test.txt'
一个try语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
【例子】
1
try:
2
int("abc")
3
s = 1 + '1'
4
f = open('test.txt')
5
print(f.read())
6
f.close()
7
except OSError as error:
8
print('打开文件出错\n原因是:' + str(error))
9
except TypeError as error:
10
print('类型出错\n原因是:' + str(error))
11
except ValueError as error:
12
print('数值出错\n原因是:' + str(error))
13
14
数值出错
15
原因是:invalid literal for int() with base 10: 'abc'
数值出错
原因是:invalid literal for int() with base 10: 'abc'
【例子】
1
dict1 = {'a': 1, 'b': 2, 'v': 22}
2
try:
3
x = dict1['y']
4
except LookupError:
5
print('查询错误')
6
except KeyError:
7
print('键错误')
8
else:
9
print(x)
10
11
查询错误
查询错误
try-except-else语句尝试查询不在dict中的键值对,从而引发了异常。这一异常准确地说应属于KeyError,但由于KeyError是LookupError的子类,且将LookupError置于KeyError之前,因此程序优先执行该except代码块。所以,使用多个except代码块时,必须坚持对其规范排序,要从最具针对性的异常到最通用的异常。
【例子】
1
dict1 = {'a': 1, 'b': 2, 'v': 22}
2
try:
3
x = dict1['y']
4
except KeyError:
5
print('键错误')
6
except LookupError:
7
print('查询错误')
8
else:
9
print(x)
10
11
键错误
键错误
【例子】一个 except 子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。
1
try:
2
s = 1 + '1'
3
int("abc")
4
f = open('test.txt')
5
print(f.read())
6
f.close()
7
except (OSError, TypeError, ValueError) as error:
8
print('出错了!\n原因是:' + str(error))
9
10
出错了!
11
原因是:unsupported operand type(s) for +: 'int' and 'str'
出错了!
原因是:unsupported operand type(s) for +: 'int' and 'str'