在Python中,对于不良/非法参数组合应抛出哪种异常?
我在想,在Python中如何表示无效的参数组合是最好的做法。我遇到了一些情况,像这样有一个函数:
def import_to_orm(name, save=False, recurse=False):
"""
:param name: Name of some external entity to import.
:param save: Save the ORM object before returning.
:param recurse: Attempt to import associated objects as well. Because you
need the original object to have a key to relate to, save must be
`True` for recurse to be `True`.
:raise BadValueError: If `recurse and not save`.
:return: The ORM object.
"""
pass
唯一让人烦恼的是,每个包都有自己的一种,通常稍微不同的BadValueError
。我知道在Java中有java.lang.IllegalArgumentException
——大家是否都理解在Python中每个人都会创建自己的BadValueError
,还是说有其他更好的方法呢?
8 个回答
50
我觉得处理这个问题的最好方法就是用Python本身的方式。Python会抛出一个类型错误(TypeError)。比如说:
$ python -c 'print(sum())'
Traceback (most recent call last):
File "<string>", line 1, in <module>
TypeError: sum expected at least 1 arguments, got 0
我们的初级开发者刚刚通过谷歌搜索“python异常错误参数”找到了这个页面,我很惊讶在过去十年里,居然没有人提出我认为很明显的答案。
150
我会从 ValueError
这个错误类型继承。
class IllegalArgumentError(ValueError):
pass
有时候,自己创建一个错误类型会更好,但最好是从一个内置的错误类型继承,这样它就能尽量接近你想要的效果。
如果你需要捕捉到这个特定的错误,给它起个名字会很有帮助。
894
我建议直接抛出一个 ValueError,除非你需要一个更具体的异常。
def import_to_orm(name, save=False, recurse=False):
if recurse and not save:
raise ValueError("save must be True if recurse is True")
其实没必要去做 class BadValueError(ValueError):pass
这个,因为你自己定义的这个类在使用上和 ValueError 是一模一样的,那为什么不直接用它呢?