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

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

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

【问题讨论】:

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

标签: python exception


【解决方案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,而是内部函数调用,请使用断言来确保代码正确。
      • 同意;如果都是菊。想要在开发过程中发现编程错误(可能是这样),那么断言是一个好方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 2017-07-03
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多