在Python中继承子类化特定异常的缺点?

时间:2014-07-24 19:54:11

标签: python exception

我遇到一种情况,即用户可能会提供不良数据以获取可能不存在的数据点。目前,发生这些问题时引发的错误类型不明确或不直接。

在我的API中,我打算创建一个错误以便在UI中捕获(或者我将让UI框架通过直接向用户报告它来处理它,我已经测试并知道它可以工作。):

class DataError(ValueError):
    '''
    raise this error with a message of what was wrong, 
    will also be caught when catching general ValueErrors
    or other Exceptions that ValueError subclasses
    '''

用法:

if user_input not in accepted_values:
    raise DataError('bad user_input: {0}'.format(user_input))

我确实对我的方法有了自己的看法,我想要相当无懈可击的代码。我知道好处,因为我可以捕捉到这个特定的异常,而不会隐藏其他异常。但我想不出任何缺点。

这样做的缺点是什么,而不是仅仅使用ValueError引发错误消息?

2 个答案:

答案 0 :(得分:2)

我是自定义异常的粉丝。使用ValueError和您的错误消息的缺点是,为了捕获此特定的错误,您还必须进行一些字符串匹配,而不是仅捕获自定义异常。提升ValueError的子类可以更容易地看到实现中存在错误。

此外,ValueError在实际涵盖的范围内相当含糊。

  

当内置操作或函数接收到参数时引发   具有正确的类型但价值不合适,情况如此   没有更精确的例外描述

据推测,您的DataError具有明确定义的有效值范围。在这种情况下,它更合适,因为它更具体。

答案 1 :(得分:2)

编写自定义异常几乎总是正确的。有了这个说法,继承异常有一些小的潜在缺点:

  1. 您的错误是否与完全对应标准库中的错误?例如,实现一个看起来像dict的对象,你只想抛出KeyError

  2. 你是否正确分类?在您的示例中,任何抓住ValueError的人也会抓住DataError。根据您的使用情况,有时可能不合适。

  3. 您是子类化的异常是否提供其他功能?这是一个类,它可能有各种各样的方法。如果你将一个异常子类化,你应该验证它的所有方法是否适合你的错误情况。

  4. 在其他情况下,例外可能根本不合适。是否存在更适合的“无价值”结果(例如None[])?