14.8 创建自定义异常

    创建新的异常很简单——定义新的类,让它继承自 (或者是任何一个已存在的异常类型)。例如,如果你编写网络相关的程序,你可能会定义一些类似如下的异常:

    然后用户就可以像通常那样使用这些异常了,例如:

    1. try:
    2. msg = s.recv()
    3. except TimeoutError as e:
    4. ...
    5. except ProtocolError as e:

    在程序中引入自定义异常可以使得你的代码更具可读性,能清晰显示谁应该阅读这个代码。还有一种设计是将自定义异常通过继承组合起来。在复杂应用程序中,使用基类来分组各种异常类也是很有用的。它可以让用户捕获一个范围很窄的特定异常,比如下面这样的:

    你还能捕获更大范围的异常,就像下面这样:

    1. try:
    2. s.send(msg)
    3. except NetworkError:
    4. ...

    看上去有点奇怪,不过Exception的默认行为是接受所有传递的参数并将它们以元组形式存储在 .args 属性中.很多其他函数库和部分Python库默认所有异常都必须有 .args 属性,因此如果你忽略了这一步,你会发现有些时候你定义的新异常不会按照期望运行。为了演示 的使用,考虑下下面这个使用内置的 RuntimeError` 异常的交互会话,注意看raise语句中使用的参数个数是怎样的:

    1. >>> try:
    2. ... raise RuntimeError('It failed')
    3. ... except RuntimeError as e:
    4. ... print(e.args)
    5. ('It failed',)
    6. >>> try:
    7. ... raise RuntimeError('It failed', 42, 'spam')
    8. ... except RuntimeError as e:
    9.  
    10. ... print(e.args)
    11. ...
    12. ('It failed', 42, 'spam')

    关于创建自定义异常的更多信息,请参考Python官方文档 <[https://docs.python.org/3/tutorial/errors.html](https://docs.python.org/3/tutorial/errors.html)>_