导入Python异常

时间:2015-02-06 02:43:54

标签: 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 = 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中处理异常的个人最佳实践。

2 个答案:

答案 0 :(得分:2)

您无法Human.UnexpectedParameterType,因为Human没有名为UnexpectedParameterType的属性。

这就是您通常希望import foo而不是from foo import ...的原因。如果你这样做,就更容易追踪到的东西。

您可以做的是创建一个附加了自己的例外的基类。这可能类似于

# 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

样本:

import foo

a = foo.Human()
try:
    a.throw_bad_parm()
except foo.Human.UnexpectedParameterType as e:
    print("You can't do that because of {!r}".format(e))

# You can't do that because of UnexpectedParameterType()

这与@staticmethod的工作方式大致相同 - 即使它们不依赖于这些类来操作,您在其他类中捆绑逻辑上属于您的代码的东西。通过这种方式,您可以执行以下操作:

class HTTPHandler(object):
    class Exception404(Exception): pass
    class Exception403(Exception): pass
    ...

答案 1 :(得分:2)

您无法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是内置类型,因此您不会显式导入它。)