在Python中,对于不良/非法参数组合应抛出哪种异常?

818 投票
8 回答
449472 浏览
提问于 2025-04-11 18:09

我在想,在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 是一模一样的,那为什么不直接用它呢?

撰写回答