【问题标题】:Python Try/Except firing TypeError despite Except clause尽管有例外子句,Python Try/Except 仍会触发 TypeError
【发布时间】:2015-12-19 21:56:48
【问题描述】:

我正在关注 Python 文档的 try/except 并做出以下努力:

def profile_check(self):
    try:
        profile = self.profile_type
        return profile
    except TypeError:
        ...

self.profile_type 是 Django 模型中的一个字段,在这种情况下不存在(因此它返回为 None)。但是,似乎缺少一些东西,因为它永远不会继续执行 except 的操作,而是立即抛出 TypeError 异常:

>>> a.profile_check()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: 'NoneType' object is not callable

这是我第一次尝试使用 try-catch,所以我知道这是基本的东西。

【问题讨论】:

  • 您确定您发布的代码是引发错误的部分吗?
  • 什么是a?看起来a.profile_checkNone
  • 异常只能在try块中被捕获。如果你一开始就没有输入它,那么......
  • a 是在此尝试中填写 self 的数据库对象。我知道它发生在 try 块中,因为它会在设置配置文件变量之前打印一条语句,而不是之后。

标签: python django try-catch


【解决方案1】:

首先,您的问题是 profile_check 出于某种原因设置为None。这就是为什么当你调用它时它会给你这个错误。

至于您的 try/catch 问题,如果变量不存在,那么 Python 解释器将向您抛出 NameError。尝试用 TypeError 代替它。

虽然没有上下文,但我无法帮助您解决您的 profile_check-is-None 情况。对不起!

【讨论】:

  • profile_check 是一个用于检查数据库中是否存在值的公式。在这种情况下,它应该是无。我的希望是,如果该值不存在,该函数将进入。也许最好改回 if-then 语句。如您所见,我得到的是 TypeError,而不是 NameError。替换 NameError 仍然给我相同的 TypeError。
  • @AdamStarrh 如果函数设置为 None,你怎么能期望调用它? :P
  • @stanpipes 我想我会得到一个可以与except 一起使用的错误。在某些情况下,该函数将返回一个值。我想我可以将None 更改为某种信号值并继续前进,如果我尝试的方法不起作用。我或多或少在尝试学习如何使用 try-catch。
  • @AdamStarrh 啊,是的。如果函数为空,则函数不会执行任何异常。这意味着它们不能被调用。您可以像在问题中所做的那样进行检查,例如 `try: a.profile_check() except TypeError: print "It's set to null!" `
  • @stanpipes 我明白了。那么在这种情况下,我在 shell 中收到的 TypeError 的来源是什么?
猜你喜欢
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
相关资源
最近更新 更多