导航
导航
文章目录
  1. 13.1 错误
  2. 13.2 try..except
    1. 处理异常
    2. 输出
    3. 如何工作
  3. 13.3 引发异常
    1. 如何引发异常
    2. 输出
    3. 如何工作
  4. 13.4 try..finally
  5. 使用finally
    1. 输出
    2. 如何工作

简明Python教程-13.异常

当读某个文件而文件不存在,或者程序运行的时候不小心删除了,等异常的状况发生时,可以使用异常来处理
例如程序中有无效的语句,Python会引发并告诉你那里有一个错误,从而处理这种情况

13.1 错误

假如把print误拼为Print,则Python会引发一个语法错误:

1
2
3
4
5
6
7
8
>>> Print 'Hello World'
File "<stdin>", line 1
Print 'Hello World'
^
SyntaxError: invalid syntax

>>> print 'Hello World'
Hello World

有一个SyntaxError被引发,并且检测到的错误位置也打印了出来,这是错误处理器所做的工作

13.2 try..except

在读取用户输入时,按Ctrl-d:

1
2
3
4
>>> s = raw_input('Enter something --> ')
Enter something --> Traceback (most recent call last):
File "<stdin>", line 1, in ?
EOFError

Python引发了一个称谓EOFError的错误,意味着程序发现一个不期望的文件尾(由Ctrl-d表示)

处理异常

使用try..except语句来处理异常
把通常的语句放在try块中,把错误处理语句放在except块中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/python
# Filename: try_except.py

import sys

try:
s = raw_input('Enter something --> ')
except EOFError:
print '\nWhy did you do an EOF on me?'
sys.exit() # exit the program
except:
print '\nSome error/exception occurred.'
# here, we are not exiting the program

print 'Done'

输出

1
2
3
4
5
6
7
$ python try_except.py
Enter something -->
Why did you do an EOF on me?

$ python try_except.py
Enter something --> Python is exceptional!
Done

如何工作

把所有可能引发错误的语句放在try块中,然后在except从句块中处理所有的错误和异常
except从句可以处理单一的错误或异常,或者一组包括在圆括号内的错误或异常
如果没有给出错误或异常名称,则处理所有的错误和异常
对于每个try从句,至少都有一个相关联的except语句
如果某个错误或异常没有被处理,则默认地Python处理器就会被调用,它会终止程序的运行,并打印一个消息
可以让try..except块关联上一个else从句,当没有异常发生时,else从句将被执行

13.3 引发异常

使用raise语句引发异常
指明错误/异常的名称,和伴随异常触发的异常对象
可以引发的错误或异常应分别是Error或Exception类的子类

如何引发异常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/python
# Filename: raising.py

class ShortInputException(Exception):
'''A user-defined exception class.'''
def __init__(self, length, atleast):
Exception.__init__(self)
self.length = length
self.atleast = atleast

try:
s = raw_input('Enter something --> ')
if len(s) < 3:
raise ShortInputException(len(s), 3)
# Other work can continue as usual here
except EOFError:
print '\nWhy did you do an EOF on me?'
except ShortInputException, x:
print 'ShortInputException: The input was of length %d, \
was expecting at least %d' % (x.length, x.atleast)
else:
print 'No exception was raised.'

输出

1
2
3
4
5
6
7
8
9
10
11
$ python raising.py
Enter something -->
Why did you do an EOF on me?

$ python raising.py
Enter something --> ab
ShortInputException: The input was of length 2, was expecting at least 3

$ python raising.py
Enter something --> abc
No exception was raised.

如何工作

例中创建一个自己的异常类型,ShortInputException类(可以使用任何预定义的异常/错误)
它有两个域——length是给定输入的长度,atleast是程序预期的最小长度
在except从句中,提供了错误类,和用来表示错误/异常对象的变量,(与函数调中的形参和实参概念类似),使用异常对象的域来为用户打印消息

13.4 try..finally

使用finally块,来完成无论异常发生与否都做的操作,如读文件时关闭文件
在一个try块下,可以同时使用except从句和finally块

使用finally

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/python
# Filename: finally.py

import time

try:
f = file('poem.txt')
while True: # our usual file-reading idiom
line = f.readline()
if len(line) == 0:
break
time.sleep(2)
print line,
finally:
f.close()
print 'Cleaning up...closed the file'

输出

1
2
3
4
5
6
7
8
$ python finally.py
Programming is fun
When the work is done
Cleaning up...closed the file
Traceback (most recent call last):
File "finally.py", line 12, in ?
time.sleep(2)
KeyboardInterrupt

如何工作

在读文件时,打印每一行之前用time.sleep方法暂停2秒,按Ctrl-c中断/取消程序
KeyboardInterrupt异常被触发,程序退出,但在程序退出之前,finally从句仍然被执行,把文件关闭