4. 抛出异常
Python 使用 raise 语句抛出一个指定的异常。
raise 语法格式如下:
以下实例如果 x 大于 5 就触发异常:
执行以上代码会触发异常:
raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。
如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出。
An exception flew by!
Traceback (most recent call last):
File “”, line 2, in ?
NameError: HiThere
5. 用户自定义异常
你可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承,例如:
My exception occurred, value: 4
class InputError(Error):
“”"Exception raised for errors in the input.
class TransitionError(Error):
“”"Raised when an operation attempts a state transition that’s not
allowed.
… raise KeyboardInterrupt
… finally:
… print(‘Goodbye, world!’)
…
Goodbye, world!
Traceback (most recent call last):
File “”, line 2, in
KeyboardInterrupt
以上例子不管 try 子句里面有没有发生异常,finally 子句都会执行。
如果一个异常在 try 子句里(或者在 except 和 else 子句里)被抛出,而又没有任何的 except 把它截住,那么这个异常会在 finally 子句执行后被抛出。
下面是一个更加复杂的例子(在同一个 try 语句里包含 except 和 finally 子句):
7. 预定义的清理行为
一些对象定义了标准的清理行为,无论系统是否成功的使用了它,一旦不需要它了,那么这个标准的清理行为就会执行。
这面这个例子展示了尝试打开一个文件,然后把内容打印到屏幕上:
以上这段代码的问题是,当执行完毕后,文件会保持打开状态,并没有被关闭。
关键词 with 语句就可以保证诸如文件之类的对象在使用完之后一定会正确的执行他的清理方法: