Python TypeError:尽管调用了TypeError异常,但仍返回了NoneType

Python TypeError:尽管调用了TypeError异常,但仍返回了NoneType,python,typeerror,Python,Typeerror,我正在嵌套字典中搜索键和返回值。我使用多个例外行设置了每个搜索,如下所示: try: accounts_category = json_data['primaryTopic']['Accounts']['AccountCategory'] except (KeyError, TypeError) as e: accounts_category = '' line = H + '|' + vn_id + '|' + sn_id + '|' + supplier_name + '\

我正在嵌套字典中搜索键和返回值。我使用多个例外行设置了每个搜索,如下所示:

try:
    accounts_category = json_data['primaryTopic']['Accounts']['AccountCategory']
except (KeyError, TypeError) as e:
    accounts_category = ''
line = H + '|' + vn_id + '|' + sn_id + '|' + supplier_name + '\n'
完成搜索后,我将组合字符串和管道分隔符,如下所示:

try:
    accounts_category = json_data['primaryTopic']['Accounts']['AccountCategory']
except (KeyError, TypeError) as e:
    accounts_category = ''
line = H + '|' + vn_id + '|' + sn_id + '|' + supplier_name + '\n'
然而,当我尝试组合变量时,我得到了一个TypeError

TypeError: coercing to Unicode: need string or buffer, NoneType found
如果我添加
if
语句,我的脚本就可以工作:

try:
    accounts_next_due_date = json_data['primaryTopic']['Accounts']['NextDueDate']
    if accounts_next_due_date:
        pass
    else:
        accounts_next_due_date = 'e'
except (KeyError, TypeError) as e:
    accounts_next_due_date = 'e'

但这对我来说似乎是重复,我哪里出了问题?

我听到你说的是你执行了以下代码:

try:
    accounts_category = json_data['primaryTopic']['Accounts']['AccountCategory']
except (KeyError, TypeError) as e:
    accounts_category = ''
然后,稍后的
科目\u类别
(或您以这种方式处理的其他变量)是
,而不是

显然,这是因为没有出现错误。相反,
json_数据['primarytico']['Accounts']['AccountCategory']
(或任何内容)实际上是
None
(即原始json中的
null

避免这种情况的最简单方法是,如果值为“false ish”,则使用
关键字添加默认值,如下所示:

使用值时也可以执行此操作:

line = "%s|%s|%s|%s\n" % (H, vn_id, sn_id, supplier_name or '')
作为奖励,因为这看起来并不是真的引发错误,所以您可以摆脱所有
try/except
样板文件。如果你仍然需要它,看在上帝的份上,请编写一个函数来完成它,而不是复制和粘贴代码无数次!例如:

def jsonfield(jsonobj, default, *names):
    try:
        for name in names:
             jsonobj = jsonobj[name]
        return jsonobj or default
    except (TypeError, KeyError):
        return default

accounts_category = json_field(json_data, "", "primaryTopic", "Accounts", "AccountCategory")
但对我来说,这似乎是重复的

是的。为了避免这种情况,只需将帐户下一个到期日初始化为无,并添加一个finally子句:

accounts_next_due_date = None

try:
    accounts_next_due_date = json_data['primaryTopic']['Accounts']['NextDueDate']
except (KeyError, TypeError):
    pass # or log the error
finally:
    if accounts_next_due_date is None:
        accounts_next_due_date = "e"

如果出现
KeyError
TypeError
,或者如果
json_数据['primarytic']['Accounts']['NextDueDate']
None
,则
finally
子句将起作用。因此没有重复的代码。

在Python2中,尝试将unicode字符串与
None
连接会引发
TypeError

>>> u'abcd' + None
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: coercing to Unicode: need string or buffer, NoneType found
这不会引发任何异常,因此
None
可以绑定到一个或多个用于构造
字符串的变量。您可以使用以下方法进行修复:

accounts_category = json_data['primaryTopic']['Accounts']['AccountCategory']
if accounts_category is None:
    accounts_category = u''
您可以将其推广到一个函数中,以便将其应用于JSON数据中的其他键

此外,您还可以使用
str.join()
更好地执行字符串的连接:

line = u'|'.join((H, vn_id, sn_id, supplier_name)

行=…
代码如何与您发布的主代码相匹配?你也可以发布完整的回溯吗?不清楚是哪一行引起了错误。请在
行=..
之前提供更多详细信息插入
打印(H、vn\u id、sn\u id、供应商名称)
,并查看其中哪一个是
。稍作解释将大有帮助。否则,我们将被迫对您的代码与问题中的代码逐个字符地进行差异。@BryanOakley:我修改了答案。如果
json_数据['primarytico']['Accounts']['AccountCategory']
是整数
0
None
以外的错误值,该怎么办?类似于你的便利函数。你可能想在一个应该是数字的字段上使用
或0
。非常感谢,我一直在努力设置一个函数,因为嵌套的深度变化很大,我一直在努力向函数传递正确的值。你帮了大忙。