在程序开发过程中,经常需要处理各种各样的异常。异常处理,是高级语言中一个强有力的工具,通过捕捉异常,可以避免程序意外退出,还可以避免数据受到破坏,让程序更加健壮。
在这篇文章中,我们将讨论异常的引发与处理。
1. 手动引发异常
raise
我们可以使用 raise
来手动引发一个异常,只需要在 raise
后面跟上异常的类型即可。
>>> raise TypeError
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
TypeError
除此之外,我们还可以指定异常的信息:
>>> raise ValueError, "invalid input"
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
ValueError: invalid input
assert
在开发过程中,我们还常常会使用 assert
来设定断言。它能让我们有条件地引发异常:如果满足条件,则忽略该语句,如果不满足条件,则触发异常。
>>> a = -1
>>> assert a > 0
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
AssertionError
我们同样可以添加异常信息:
>>> a = -1
>>> assert a > 0, "value should not be negative"
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
AssertionError: value should not be negative
2. 处理特定异常
我们最常见的异常处理语句应该属 try/except
语句了,将可能引发异常的代码放到 try
语句块中,将异常发生时的处理代码放在 except
语句块中。except
后面跟上要捕捉的异常类型:
try:
int("hello")
except ValueError:
print "invalid value"
我们可以通过 as
将异常赋值给变量,读取异常的信息:
try:
int("hello")
except ValueError as e:
print e
3. 处理多种异常
以元组形式指定异常类型
如果要处理的异常有多个,我们可以将这些异常以元组的形式提供给 except
语句,例如:
try:
file = open('test.txt', 'r')
except (IOError, EOFError) as e:
print "error occurred:", e
多个except语句
我们也可以编写多个 except
语句来处理多个异常:
try:
file = open('test.txt', 'r')
except EOFError as e:
print "EOFError occurred"
except IOError as e:
print "IOError occurred"
捕捉所有异常
虽然推荐明确写出要捕捉的异常类型,不过事实上可以不指定异常类型,从而捕捉所有异常:
try:
3 / 0
except:
print "error occurred"
使用Exception类
如果不明确具体的异常类型,而又想获取异常信息,可以指定异常类型为 Exception
,因为Python中所有的异常类型均继承自 Exception
类。
try:
"123" / 2
except Exception as e:
print e.message
4. finally语句
在进行异常处理时,except
语句块内的代码只有在异常发生时才会被执行。而有些时候,我们希望无论是否发生异常,都要执行某段代码,这时就可以使用 finally
语句来实现:
try:
float(raw_input())
except ValueError as e:
print "invalid input"
finally:
print "This will be printed whether error occurs or not"
5. else语句
如果我们想要在异常没有发生时才执行某段代码,而当异常发生时则不执行,那么可以使用 else
语句来实现:
try:
int(raw_input())
except ValueError as e:
print "Please input a number."
else:
print "You have input a number."
6. 自定义异常类型
当我们编写函数或模块时,需要考虑到可能出现的异常情况。在必要的时候,可以手动引发异常。如果我们想定义自己的异常类型,可以编写一个异常类。由于 Python 规定,所有异常都必须继承 Exception
类,因此我们也应该让自己定义的类继承于 Exception
。
我们假设有一个函数,当它被调用时,传入的参数必须在一定的数值范围之内,否则将引发 RangeError 异常,那么我们可以简单定义该异常类型:
class RangeError(Exception):
pass
在特定情况下引发该异常:
def process(value):
if value < 0 or value > 10000:
raise RangeError
pass
这样一来,当开发者调用该函数时,如果不小心传入不满足要求的数值参数,就可以通过异常类型和异常信息了解出现问题的地方。
作者:Wray Zheng
原文:http://www.codebelief.com/article/2017/04/python-advanced-programming-exception-handling/