说我有一个
class Rocket(object):
def __init__(self):
self.ready = False
def prepare_for_takeoff(self):
self.ready = True
def takeoff(self):
if not self.ready:
raise NotReadyException("not ready!")
print("Liftoff!")
现在,哪个standard exceptions最适合从NotReadyException
派生?它是ValueError
,因为self
的状态/值有错误吗?
答案 0 :(得分:6)
现在,哪个标准异常最适合从?
派生NotReadyException
Exception
不要乱用别的东西。
http://code.google.com/p/soc/wiki/PythonStyleGuide#Exceptions
您的异常处理用例是什么?
如果从ValueError
中派生出例外,您是否会编写一个使用except ValueError:
来捕获异常并以完全相同的方式处理它们的处理程序?不太可能。
ValueError
是一个包罗万象。你的例外很具体。
当你有这样的特定于应用程序的异常时,它与内置异常共享任何有用语义的几率很低。将新的和现有的异常实际组合到单个处理程序中的几率非常非常低。
关于您将特定于应用程序的异常与一般异常组合的唯一时间是在某些全能记录器中使用except Exception:
。
答案 1 :(得分:2)
我只是从Exception
派生出来。抓住ValueError
的程序员可能会非常惊讶他们也抓住了NotReadyException
。
如果您将定义许多类似的与状态相关的异常,并且能够捕获所有异常将很方便,您可以定义StateError
异常,然后派生{{1}从那起。