UU Blog

Python 异常接管/引出

异常处理

Python 的异常接管和很多程序的都差不多,尤其是Pascal。

常见的异常类型有

1
2
3
4
5
6
ImportError:an import fails 导入失败,一般导入了无效的模块
IndexError:a list is indexed with an out of range number 超出列表最大长度
NameError:an unknown variable is used 未定义的变量
SyntaxError:the code can't be parsed properly 不能匹配的语法
TypeError:a funxtion is called on a value of an inappropriate type 错误的类型
ValueError:a function is called on a value of the correct type but with an inappropriate value 错误的值

异常的接管

1
2
3
4
try:
# do sth
except <具体要接管的错误类型,留空则接管所有异常>:
# 异常处理部分

比如除以0的时候都会抛出一个ZeroDivisionError异常。

而接管异常处理示例

1
2
3
4
try:
result = 1 / 0
except ZeroDivisionError:
print('error')

又或者留空,默认接管所有异常。

1
2
3
4
try:
result = 1 / 0
except:
print('error')

又或者使用多个except接管多个不同类型的异常。

1
2
3
4
5
6
try:
result = 1 / 0
except ZeroDivisionError:
print('ZeroDivisionError')
except IOError:
print('IOError')

以上只是列举了异常类型的小部分

异常类型列表

如果想查看更多异常类型,可以导入exceptions模块,用dir查看。如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
In [1]: import exceptions

In [2]: dir(exceptions)
Out[2]:
['ArithmeticError',
'AssertionError',
'AttributeError',
'BaseException',
'BufferError',
'BytesWarning',
'DeprecationWarning',
'EOFError',
'EnvironmentError',
'Exception',
'FloatingPointError',
'FutureWarning',
'GeneratorExit',
'IOError',
'ImportError',
'ImportWarning',
'IndentationError',
'IndexError',
'KeyError',
'KeyboardInterrupt',
'LookupError',
'MemoryError',
'NameError',
'NotImplementedError',
'OSError',
'OverflowError',
'PendingDeprecationWarning',
'ReferenceError',
'RuntimeError',
'RuntimeWarning',
'StandardError',
'StopIteration',
'SyntaxError',
'SyntaxWarning',
'SystemError',
'SystemExit',
'TabError',
'TypeError',
'UnboundLocalError',
'UnicodeDecodeError',
'UnicodeEncodeError',
'UnicodeError',
'UnicodeTranslateError',
'UnicodeWarning',
'UserWarning',
'ValueError',
'Warning',
'ZeroDivisionError',
'__doc__',
'__name__',
'__package__']

对象安全释放

这个和许多语言都有点类似。一般在发生异常的时候,执行就被中断了。而有些被打开的数据有可能会被丢失。

尤其是用open打开文件的时候,很有可能导致内容丢失。所以为了让代码在出现异常的时候,一样能执行特定的代码。比如释放对象,安全关闭文件等。就有了 try ... finally语句。

1
2
3
4
try:
result = 1 / 0
finally:
print('still working.')

比如常见安全关闭文件

1
2
3
4
5
try:
f = open('test.txt','wb')
result = 1 / 0
finally:
f.close()

不过对于安全打开关闭文件,一般更推荐的做法是用with

1
2
3
with open("test.txt","wb") as f:
result = 1 / 0
#or do sth.

提起/引出异常 raise

有时候在处理潜在有问题的代码的时候,你希望主动引出一个异常,可以用raise语句。

比如引出一个 ValueError

raise ValueError

异常带参数描述异常

raise ValueError('值错误')

断言assert

断言使用,可能都是用于自己调试程序的时候才会用到。

assert 1!=1 当后面表达式不为True的时候,就会引发AssertionError错误。

给作者打一针鸡血