导入Python异常

导入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

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 = 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()?(因为这是一门课…?)