抛出啥异常? (Python)[重复]

Posted

技术标签:

【中文标题】抛出啥异常? (Python)[重复]【英文标题】:What exception to throw? (Python) [duplicate]抛出什么异常? (Python)[重复] 【发布时间】:2011-07-22 18:29:47 【问题描述】:

如果我有一个带有 2 个可选参数(用于搜索条件)但没有提供任何参数(我需要至少一个参数)的 python 函数,那么应该抛出什么异常?

如果我只需要传递两个参数之一怎么办?如果提供了两个,会抛出什么异常?或者可以创建两个不同的功能?

【问题讨论】:

如果这两个参数都是必需的,为什么这些参数都是可选的? 我只需要 1 of 2 ... 不是 0,不是 2 :) 那你为什么不直接用一个参数编写你的函数并检查它是什么类型/值呢? 听说python中检查参数类型不好 让函数根据输入做不同的事情是不好的除非它应该做什么很明显 将您的信息粘贴在文档字符串中,并确保任何阅读的人都清楚你的代码,没问题。 【参考方案1】:

TypeError 是最合适的 - 这是你通常得到的。

【讨论】:

尝试使用具有必需参数(不提供参数)的函数,您将确切地看到您想要提供的内容。【参考方案2】:

您可以找到内置 Python exceptions here 的列表,但请记住,如果这些都与您所追求的不匹配,您始终可以创建自己的异常。

我建议使用 TypeError(这是您通常在使用的 Python 代码中看到的)。您还可以使用 AssertionError,并断言至少应该为函数提供一个参数。

【讨论】:

【参考方案3】:

我会抛出一个信息丰富的TypeError

if no_args or both_args:
    raise TypeError('f() must be passed exactly one of foo=value, bar=value')

【讨论】:

【参考方案4】:

为什么不使用断言?

assert len(args) > 1, "At least one argument should be passed to the function"

【讨论】:

断言背后有不同的抽象概念;他们将帮助及早发现编程错误;您通常不会捕获由于断言失败而引发的异常。另一方面,异常通常会在稍后被调用代码捕获以处理这种情况。您还必须记住,断言可以被配置掉,因此它们根本不会被评估)选项 -O 到解释器)。是否可以考虑这种情况。 确实如此。我的回答思路是:如果这不是公共 API,而是内部函数调用,请使用断言来确保代码正确。 同意;如果都是菊。想要在开发过程中发现编程错误(可能是这样),那么断言是一个好方法。

以上是关于抛出啥异常? (Python)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如果我不告诉 C++ 中要抛出啥类型的对象,会抛出啥 throw 语句?

当整数除以零时,msvc 6 会抛出啥?

修复 ThinkPHP3.2.3 抛出异常模块的一个BUG

为啥我们不能只抛出异常/可抛出而不是有多个异常[重复]

HttpURLConnection 抛出异常 [重复]

为啥 JPA 重复持久方法不抛出异常?