Python 高级编程:异常编码处理

在程序开发过程中,经常需要处理各种各样的异常。异常处理,是高级语言中一个强有力的工具,通过捕捉异常,可以避免程序意外退出,还可以避免数据受到破坏,让程序更加健壮。

在这篇文章中,我们将讨论异常的引发与处理。

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

这样一来,当开发者调用该函数时,如果不小心传入不满足要求的数值参数,就可以通过异常类型和异常信息了解出现问题的地方。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注