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.")