Python 如果作为参数未遇到任何异常,则引发适当的异常

Python 如果作为参数未遇到任何异常,则引发适当的异常,python,exception,Python,Exception,当我的一个函数检测到在需要参数值的地方传递了None时,要引发的“适当”异常类是什么?例如: def MyFunction(MyArg1, MyArg2): if not MyArg2: raise ?Error? 我想我已经看到这里使用了TypeError(确实,我收到了一个NoneType,其中需要一些其他类型),但我觉得这并不适合这种情况,因为我认为异常可能更显式。只需使用断言: assert type(MyArg2) == int 或者: asser

当我的一个函数检测到在需要参数值的地方传递了
None
时,要引发的“适当”异常类是什么?例如:

 def MyFunction(MyArg1, MyArg2):

     if not MyArg2:
          raise ?Error?
我想我已经看到这里使用了
TypeError
(确实,我收到了一个
NoneType
,其中需要一些其他类型),但我觉得这并不适合这种情况,因为我认为异常可能更显式。

只需使用断言:

assert type(MyArg2) == int
或者:

assert type(MyArg2) != None

这将防止有人向您传递错误的类型,以及处理无问题。它将返回一个
AssertionError

如果
None
作为参数传递,大多数python函数都会引发
TypeError
。取任何函数,比如说
chr(None)
,看看它会引发
TypeError

Python中没有“无效参数”或“空指针”内置异常。相反,大多数函数都会引发
TypeError
(无效类型,如
NoneType
)或
ValueError
(类型正确,但值不在可接受的域内)

如果您的函数需要一个特定类的对象,而得到的却是
None
,那么它可能会像您指出的那样引发
TypeError
。在这种情况下,您应该显式地检查
None
,因为如果正确类型的对象实现了
\uuuuuuu非零\uuuuuuu
,则其计算结果可能为布尔值
False

if MyArg2 is None:
    raise TypeError
Python文档

  • 类型错误
    /
  • ValueError
    /

正如其他人所指出的,
TypeError
ValueError
是自然的。如果它看起来不够具体,您可以将两个异常中比较合适的一个子类化。这允许一致地处理一大类函数的无效参数,同时也为特定函数提供了更多细节

如何创建和使用一个简单的自定义非异常:(也许它值得2行代码)

请参阅Python文档:

您根本不应该进行这种参数检查。只要让它进一步失败,不管它有什么例外。(如果您真的必须这样做,
TypeError
是正确的异常。添加一个解释字符串使其更加具体。)我可能会提出一个
TypeError
,看看内置的python异常文档:@Sven:我通常按照您的建议执行,但这是一种特殊情况,我确实希望完成这种检查,这与Python的duck类型精神完全相反。它对守则的适用性施加了不必要的限制。(不是我的反对票,顺便说一句)@SvenMarnach-Hmm,我成功地使用它是因为duck的输入。也就是说,duck类型隐藏了某些东西失败的原因。如果你发现自己需要在我们开始之前说这个或那个,那么断言只是一种方便的方式。例如,在输入变量上编写一个带有For循环的函数。假定它是用于全局绑定的文件名列表。如果不是传递一个包含一个项的列表,而是传递一个包含glob chars的字符串,那么会发生什么情况?断言的问题是它忽略了可以很好地用作(在本例中)整数的值,包括长整数、浮点数(在许多情况下,例如
range()
)和实现
\uu int\uuuuu()的任何对象
特殊方法。如果您觉得需要这类东西,更好的方法可能是在方法的早期尝试将参数强制为整数,例如,
MyArg2=int(MyArg2)
@kindall,但是您会注意到,询问者没有指定他想要什么,除了没有指定之外。我只是给了他一个我以前用过的选择。如果他的范围比我的更广,那么我同意你的看法。如果他想要一个特定的类型,那么断言你想要的比定义你知道的错误要好。断言应该只用于测试代码的正确性,而不是验证用户提交的值。
class NoneError(Exception):
    pass

raise NoneError("Object not constructed. Cannot access a 'None' object.")