导入Python异常
在foo.py中给出以下代码:导入Python异常,python,exception,exception-handling,Python,Exception,Exception Handling,在foo.py中给出以下代码: class Error(Exception): pass class UnexpectedParameterType(Error): pass class Human(models.Manager): def create_human(self, name): if not isinstance(name, str): raise UnexpectedParameterType human
class Error(Exception):
pass
class UnexpectedParameterType(Error):
pass
class Human(models.Manager):
def create_human(self, name):
if not isinstance(name, str):
raise UnexpectedParameterType
human = Human(name = name)
return human
我是否一定要在bar.py中显式导入我的异常类,以便捕获抛出的异常?像这样:
from foo import UnexpectedParameterType, Human
human = Human()
try:
human.create_human(123)
except UnexpectedParameterType:
return "Cannot create human."
我在这里暗示的是能够做这样的事情:
from foo import Human
[...]
except Human.UnexpectedParameterType:
return "Cannot create human."
非常感谢您的回答,谢谢!请随意分享您在Python中处理异常的个人最佳实践。您不能使用
人工。意外参数类型
,因为人工
没有名为意外参数类型
的属性
这就是为什么您通常希望执行导入foo
而不是从foo导入…
。如果你这样做的话,追踪事情的走向会更容易
您可以做的是创建一个基类,该基类附带有自己的异常。这可能是
# foo.py
class Human(object):
class Error(Exception):
pass
class UnexpectedParameterType(Error):
pass
def throw_bad_parm(self):
raise self.UnexpectedParameterType
# the rest of your function in Human
演示:
这与@staticmethod
的工作方式大致相同——您将逻辑上属于代码一部分的内容绑定到其他类中,即使它们不依赖这些类来操作。通过这种方式,您可以执行以下操作:
class HTTPHandler(object):
class Exception404(Exception): pass
class Exception403(Exception): pass
...
无法执行
Human.UnexpectedParameterType
,因为Human
没有名为UnexpectedParameterType
的属性
这就是为什么您通常希望执行导入foo
而不是从foo导入…
。如果你这样做的话,追踪事情的走向会更容易
您可以做的是创建一个基类,该基类附带有自己的异常。这可能是
# foo.py
class Human(object):
class Error(Exception):
pass
class UnexpectedParameterType(Error):
pass
def throw_bad_parm(self):
raise self.UnexpectedParameterType
# the rest of your function in Human
演示:
这与@staticmethod
的工作方式大致相同——您将逻辑上属于代码一部分的内容绑定到其他类中,即使它们不依赖这些类来操作。通过这种方式,您可以执行以下操作:
class HTTPHandler(object):
class Exception404(Exception): pass
class Exception403(Exception): pass
...
您不能执行
Human.UnexpectedParameterType
,因为UnexpectedParameterType
不是Human
类上的属性;它是foo
模块的一部分。你可以这样做
import foo
human = foo.Human()
try:
human.create_human(123)
except foo.UnexpectedParameterType:
return "Cannot create human."
否则,是的,您必须显式地导入它
然而,在这种特定情况下,Python已经有了一个表示错误类型的异常:
TypeError
。因此,您可以提出TypeError
,然后捕获TypeError
。(TypeError
是一个内置类型,因此您不能显式导入它。)您不能执行Human.UnexpectedParameterType
,因为UnexpectedParameterType
不是Human
类上的属性;它是foo
模块的一部分。你可以这样做
import foo
human = foo.Human()
try:
human.create_human(123)
except foo.UnexpectedParameterType:
return "Cannot create human."
否则,是的,您必须显式地导入它
然而,在这种特定情况下,Python已经有了一个表示错误类型的异常:
TypeError
。因此,您可以提出TypeError
,然后捕获TypeError
。(TypeError
是一个内置类型,因此您不需要显式导入它。)这就是我的想法,但如果您回想一下Django,您可以执行类似的操作:MyModel.DoesNotExist,其中MyModel是一个类而不是一个文件。这基本上也是我在代码中要做的。@heapoverflow您不能在注释中放置文本块。这也很好,我看到你把一个班放在另一个班里。这在Python中合法吗?@heapoverflow类是对象。事实上,几乎所有东西都是一个物体。可以将对象放置在对象中的对象中的对象。这与将函数放入函数中或将函数传递给函数没有什么不同。你甚至可以把一个类放在一个函数中,尽管我不知道你为什么要这样做。我明白了。。。但是,您不需要在这里用括号引发异常吗,比如:raise self.UnexpectedParameterType()?(因为它是一个类…?)我就是这么想的,但是如果你回想一下Django,你可以做一些类似的事情:MyModel.DoesNotExist,其中MyModel是一个类而不是一个文件。这基本上也是我在代码中要做的。@heapoverflow您不能在注释中放置文本块。这也很好,我看到你把一个班放在另一个班里。这在Python中合法吗?@heapoverflow类是对象。事实上,几乎所有东西都是一个物体。可以将对象放置在对象中的对象中的对象。这与将函数放入函数中或将函数传递给函数没有什么不同。你甚至可以把一个类放在一个函数中,尽管我不知道你为什么要这样做。我明白了。。。但是,您不需要在这里用括号引发异常吗,比如:raise self.UnexpectedParameterType()?(因为这是一门课…?)