我们应该注意一个列表standard python exceptions,但我不认为这些是我们应该提出的,因为它们很少适用。
我很好奇标准python库中是否存在列表,例外类似于.NET的ApplicationException,ArgumentNullException,ArgumentOutOfRangeException,InvalidOperationException - 我们的例外情况可以提高自己吗?
或者是否有不同的,更加pythonic的方式来处理常见错误情况,而不是提出标准异常?
编辑:我不是在询问如何处理异常,而是在可能的情况下我应该提出哪些类型。
答案 0 :(得分:14)
如果错误与其中一个标准python异常类的描述匹配,那么一定要抛出它。
常用的是TypeError
和ValueError
,您链接的列表已经是标准列表。
如果你想拥有特定于应用程序的那些,那么继承子类化Exception或其中一个后代是可行的方法。
引用您从.NET提供的示例
ApplicationException
最接近RuntimeError
ArgumentNullException
可能是AttributeError
(尝试并调用您想要的方法,让python引发异常并输入)
AttributeOutOfRange
只是一个更具体的ValueError
InvalidOperationException
可以是python标准库中任意数量的大致相同的异常。
基本上,根据http://docs.python.org/library/exceptions.html页面中的说明选择一个反映您正在筹集的错误。
答案 1 :(得分:13)
首先,Python为您提出标准例外。
请求宽恕比要求许可更好
只需尝试操作,让Python引发异常。不要用if would_not_work(): raise Exception
括起所有内容。永远不值得写。 Python已在所有情况下执行此操作。
如果您认为需要提出标准异常,那么您可能编写了太多代码。
您可能需要加注ValueError
。
def someFunction( arg1 ):
if arg1 <= 0.0:
raise ValueError( "Guess Again." )
偶尔,您可能需要提高TypeError
,但这种情况很少见。
def someFunctionWithConstraints( arg1 ):
if isinstance(arg1,float):
raise TypeError( "Can't work with float and can't convert to int, either" )
etc.
其次,您几乎总是希望创建自己独特的例外。
class MyException( Exception ):
pass
这就是为您的应用创造独特和独特的东西所需的一切。
答案 2 :(得分:5)
我似乎记得通过文档训练可以提出预定义的异常,只要它们是合适的。例如,推荐的终止方法不再是调用exit()而是调用SystemExit。
给出的另一个例子是在自定义容器类型上重用IndexError异常。
当然,您的应用程序应该定义自己的异常,而不是实际重新调整系统异常。我只是说禁止在适当的时候重复使用它们。
答案 3 :(得分:2)
Pythonic方式只是让异常从Python本身传递出去。例如,而不是:
def foo(arg):
if arg is None:
raise SomeNoneException
bar = arg.param
只是做:
def foo(arg):
bar = arg.param
如果arg
为None
或者没有param
属性,您将从Python本身获得异常。
在Python glossary中,这称为“EAFP”:
比获得许可更容易请求宽恕。这是常见的Python编码 风格假定存在有效 键或属性和捕获 如果假设证明有例外 假。这种干净,快速的风格是 特点是存在许多 尝试和除了陈述。该 技术与LBYL形成鲜明对比(Look Before You Leap) 许多其他语言共有的风格 例如C.
它与Python固有的鸭子打字理念配合使用。
这并不意味着你不应该创建自己的异常,当然,只是你不需要包装已经存在的Python异常。
对于您自己的例外,创建派生自Exception
的类,并在适当的时候抛出它们。