开发者社区> 问答> 正文

创建自定义异常

在你构建的应用程序中,你想将底层异常包装成自定义的异常。

展开
收起
哦哦喔 2020-04-17 17:33:59 967 0
2 条回答
写回答
取消 提交回答
  • 有点尴尬唉 你要寻找的东西已经被吃掉啦!
    
    在程序中引入自定义异常可以使得你的代码更具可读性,能清晰显示谁应该阅读这个代码。 还有一种设计是将自定义异常通过继承组合起来。在复杂应用程序中, 使用基类来分组各种异常类也是很有用的。它可以让用户捕获一个范围很窄的特定异常,比如下面这样的:
    
    try:
        s.send(msg)
    except ProtocolError:
        ...
    
    你还能捕获更大范围的异常,就像下面这样:
    
    try:
        s.send(msg)
    except NetworkError:
        ...
    
    如果你想定义的新异常重写了 __init__() 方法, 确保你使用所有参数调用 Exception.__init__() ,例如:
    
    class CustomError(Exception):
        def __init__(self, message, status):
            super().__init__(message, status)
            self.message = message
            self.status = status
    
    看上去有点奇怪,不过Exception的默认行为是接受所有传递的参数并将它们以元组形式存储在 .args 属性中. 很多其他函数库和部分Python库默认所有异常都必须有 .args 属性, 因此如果你忽略了这一步,你会发现有些时候你定义的新异常不会按照期望运行。 为了演示 .args 的使用,考虑下下面这个使用内置的 RuntimeError` 异常的交互会话, 注意看raise语句中使用的参数个数是怎样的:
    
    >>> try:
    ...     raise RuntimeError('It failed')
    ... except RuntimeError as e:
    ...     print(e.args)
    ...
    ('It failed',)
    >>> try:
    ...     raise RuntimeError('It failed', 42, 'spam')
    ... except RuntimeError as e:
    
    ...     print(e.args)
    ...
    ('It failed', 42, 'spam')
    >>>
    
    
    
    2020-04-17 18:00:58
    赞同 展开评论 打赏
  • 创建新的异常很简单——定义新的类,让它继承自 Exception (或者是任何一个已存在的异常类型)。 例如,如果你编写网络相关的程序,你可能会定义一些类似如下的异常:
    
    class NetworkError(Exception):
        pass
    
    class HostnameError(NetworkError):
        pass
    
    class TimeoutError(NetworkError):
        pass
    
    class ProtocolError(NetworkError):
        pass
    然后用户就可以像通常那样使用这些异常了,例如:
    
    try:
        msg = s.recv()
    except TimeoutError as e:
        ...
    except ProtocolError as e:
        ...
    
    2020-04-17 17:34:07
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载