本文共 2005 字,大约阅读时间需要 6 分钟。
Raise语句运行程序员强制抛出一个具体的异常。例如:
>>> raise NameError(’HiThere’)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: HiThere
Raise的唯一参数描述了将要抛出的异常。这可以是一个异常的实例或者一个异常类。(继承Exception类)
如果你想要判定是否抛出了一个异常但是不想处理它,raise语句有种简单的形式可以帮助你重新抛出异常。
>>> try:
... raise NameError(’HiThere’)
... except NameError:
... print(’An exception flew by!’)
... raise
...
An exception flew by!
Traceback (most recent call last):
File "<stdin>", line 2, in ?
NameError: HiThere
程序员可以通过创建一个新异常类定义自己的异常。异常类要求直接或者间接继承exception类。
>>> class MyError(Exception):
... def __init__(self, value):
... self.value = value
... def __str__(self):
... return repr(self.value)
...
>>> try:
... raise MyError(2
*
2)
... except MyError as e:
... print(’My exception occurred, value:’, e.value)
...
My exception occurred, value: 4
>>> raise MyError(’oops!’)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
__main__.MyError: ’oops!’
在这个例子中,异常Exception类中默认的方法_init_()被重写了。新作用就是简单创建一个value的属性。这替换了创建args属性的默认行为。
异常类可以定义其他类做的任何事情。但是常常比较简单,仅仅提供一些让异常处理器来提取的错误信息的属性。当创建一个能抛出不同异常的模块时候,习惯做法就是创建一个为这个模块异常定义的基类。子类可以为不同的错误情况创建不同的具体异常。
class Error(Exception):
"""Base class for exceptions in this module.""" 在这个模块中的异常基类
pass
class InputError(Error):
"""Exception raised for errors in the input. 输入时候抛出异常
Attributes:
expression -- input expression in which the error occurred
message -- explanation of the error
"""
def __init__(self, expression, message):
self.expression = expression
self.message = message
class TransitionError(Error):
"""Raised when an operation attempts a state transition that’s not
Allowed. 当一个操作试图访问不允许访问的状态事务时抛出异常
Attributes:
previous -- state at beginning of transition 在事务开始时的状态
next -- attempted new state 操作新的状态
message -- explanation of why the specific transition is not allowed 解释具体事务异常不允许的原因
"""
def __init__(self, previous, next, message):
self.previous = previous
self.next = next
self.message = message
大多数异常定义以Error结尾,这和标准异常的命名有点相似。
许多标准模块定义了自己的异常,来显示在它方法中可能发生的异常。更多的详细信息请参考类节。
转载地址:http://eskai.baihongyu.com/