在 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中处理异常的个人最佳实践。
答案 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
是内置类型,因此您不会显式导入它。)