我遇到一种情况,即用户可能会提供不良数据以获取可能不存在的数据点。目前,发生这些问题时引发的错误类型不明确或不直接。
在我的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
引发错误消息?
答案 0 :(得分:2)
我是自定义异常的粉丝。使用ValueError
和您的错误消息的缺点是,为了捕获此特定的错误,您还必须进行一些字符串匹配,而不是仅捕获自定义异常。提升ValueError的子类可以更容易地看到实现中存在错误。
此外,ValueError
在实际涵盖的范围内相当含糊。
当内置操作或函数接收到参数时引发 具有正确的类型但价值不合适,情况如此 没有更精确的例外描述
据推测,您的DataError
具有明确定义的有效值范围。在这种情况下,它更合适,因为它更具体。
答案 1 :(得分:2)
编写自定义异常几乎总是正确的。有了这个说法,继承异常有一些小的潜在缺点:
您的错误是否与完全对应标准库中的错误?例如,实现一个看起来像dict的对象,你只想抛出KeyError
。
你是否正确分类?在您的示例中,任何抓住ValueError
的人也会抓住DataError
。根据您的使用情况,有时可能不合适。
您是子类化的异常是否提供其他功能?这是一个类,它可能有各种各样的方法。如果你将一个异常子类化,你应该验证它的所有方法是否适合你的错误情况。
在其他情况下,例外可能根本不合适。是否存在更适合的“无价值”结果(例如None
或[]
)?