什么时候应该在Python中继承异常?


10

在我的代码中,大约有七个地方会引发异常。所有这些异常的处理方式相同:将错误输出到日志文件,将软件状态恢复为默认状态并退出。

在代码审查期间,我非常重视的高级工程师说,我应该将所有这些异常归为一类。他的论点是,将来我们可能希望以不同的方式处理异常,这将更加容易。

我的观点是当前它只会使我们的代码混乱,并且由于我们不知道我们是否会以不同的方式处理异常,因此我们应该将代码保持简洁,并且如果时间到了,那么我们应该将其子类型化。

我想听听每种情况的论点。


2
YAGNI ...您现在不需要它了,以后可以随时添加它而没有太多困难。
罗伯特·哈维

你有什么例子吗?Exception例如,您是否只是提出或更具体的内置错误?
jonrsharpe

只是引发一个Exception(“ specific description”)
Ezra

至少@Ezra,您应该查看是否有更合适的内置异常(请参阅docs.python.org/2/library/exceptions.html)。
jonrsharpe 2015年

Answers:


8

你是对的

Robert Harvey已经提到了支持您的观点:不要添加您现在不需要的代码,尤其是因为以后添加它很容易。

您的评论者也正确

另一方面,审阅者的观点也是可以理解的:

  • 返回一个泛型Exception()对调用者不是很有帮助:尽管异常描述向人类表明发生了什么,但是以编程方式以不同方式处理异常可能是不可能的。使用您的代码的开发人员可能不愿意更改异常的类型,包括由于担心(不管是否合理)破坏某些东西。

    请注意,现在添加自定义异常并不困难

    class MyCustomException(Exception):
        pass

    是你所需要的全部。那只是两行代码(考虑到如果将自定义异常放在一个文件中,甚至可能不需要创建一个单独的文件)。

  • 代码本身看起来更好,更易读。

    if price < self.PriceMinValue:
        raise OutOfRangeException("The price is inferior to zero.")

    相较于:

    if price < self.PriceMinValue:
        raise Exception("The price is inferior to zero.")

    由于显示了异常类型:

    • 在第二段代码中,我需要阅读说明并猜测价格超出范围(或者不是吗?也许在某些情况下价格可能为负,例如回扣?)

    • 在第一段代码中,对类型的一瞥会立即显示有关错误的信息。看起来好像有一组价格允许值,而当前值不在此范围内。

所以?

所以:

  • 两种方法都是有效的。如果在不需要自定义类型时不对异常进行子类化,那么您是对的。当您对异常进行子类化是因为它不需要花费任何代价,并且以后可能会有用,您是对的。

  • 与您的团队保持一致。如果您的团队广泛使用自定义例外,请使用它们。


2
但是有一个快乐的媒介:raise ValueError('The price is less than zero')。这比base更具体Exception,但没有大惊小怪。
jonrsharpe

对于简单的陈述“保持一致”,请+1;如果您有,请与团队联系;否则,请与您自己联系。
Styne666 '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.