0

在我正在运行的单元测试用例中,我KeyError在下面的 json 文本中的第 4 个 json 对象上遇到异常,因为负责解码的代码正在寻找一个不存在但应该存在的对象。

我浏览了子对象,发现是“cpuid”对象导致了问题。当我删除它并运行测试时,它工作正常。

def _make_report_entry(record):
    response = self.app.post(
      '/machinestats',
      params = dict(record = self.json_encode([{
          "type": "crash",
          "instance_id": "xxx",
          "version": "0.2.0",
          "build_id": "unknown",
          "crash_text": "Gah!"
        },
        {
          "type": "machine_info",
          "machine_info": "I'm awesome.",
          "version": "0.2.0",
          "build_id": "unknown",
          "instance_id": "yyy"
        },
        {
          "machine_info": "Soup",
          "crash_text": "boom!",
          "version": "0.2.0",
          "build_id": "unknown",
          "instance_id": "zzz",
          "type": "crash"
        },
        {
          "build_id": "unknown",
          "cpu_brand": "intel",
          "cpu_count": 4,
          "cpuid": {
            "00000000": {
              "eax": 123,
              "ebx": 456,
              "ecx": 789,
              "edx": 321
            },
            "00000001": {
              "eax": 123,
              "ebx": 456,
              "ecx": 789,
              "edx": 321
            }
          },
          "driver_installed": True,
          "instance_id": "yyy",
          "version": "0.2.0",
          "machine_info": "I'm awesome.",
          "os_version": "linux",
          "physical_memory_mib": 1024,
          "product_loaded": True,
          "type": "machine_info",
          "virtualization_advertised": True
        }
      ])))

在正在测试的这段代码中,我使用 django.utils 中的 simplejson.JSONDecoder 来解码 JSON。当我记录传递给我的解码函数的上述 JSON 的解码输出时,我得到这个:

root: INFO: {u'instance_id': u'xxx', u'type': u'crash', u'crash_text': u'Gah!', u'version': u'0.2.0', u'build_id': u'unknown'}

root: INFO: {u'build_id': u'unknown', u'instance_id': u'yyy', u'version': u'0.2.0', u'machine_info': u"I'm awesome.", u'type': u'machine_info'}

root: INFO: {u'build_id': u'unknown', u'machine_info': u'Soup', u'version': u'0.2.0', u'instance_id': u'zzz', u'crash_text': u'boom!', u'type': u'crash'}

root: INFO: {u'eax': 123, u'edx': 321, u'ebx': 456, u'ecx': 789}

在最后一个 JSON 对象上,只有 JSON cpuid 对象中的对象被传递给我的解码函数。因为我的解码函数需要其他对象(例如,'type'、'instance_id'等),所以我得到一个 KeyError 异常。

[抱歉之前不必要的长帖子,我希望这会缩小一点]

4

2 回答 2

1

复制和粘贴您传递给的内容self.json_encode,并将其用作json.dumpsimport json在 Python 2.6 中的 an 之后)的参数,效果很好。因此,似乎错误可能出在json_encode您没有向我们展示的方法中:除了调用json.dumps...之外,它还有什么作用?(或者simplejson.dumps如果您使用的是 Python < 2.6,当然)。

编辑:使用json_encode = json.JSONEncoder().encode(正如刚刚发布的OP,除了使用旧的simplejson,因为我已经提到过作为一种可能性)也可以正常工作。不完整的堆栈跟踪也作为 Q 的大型编辑的一部分发布,这表明错误出现在解码部分,可能是由于滥用某些模型(无法判断,因为我们没有看到模型)——作为 OP提到他现在发布了更多信息,但仍然不足以调试问题。

这强烈表明 OP 一次尝试并简化问题是值得的,直到最后一次增量简化使错误消失 - 这通常强烈暗示错误可能是什么,但即使它没有t,发布重现错误的最小方法以及如果进一步删除一小部分代码,错误将消失的信息,可能会帮助像我们这样的“第三方观察者”协助调试。SO 并不是一个真正为集体调试而设计的平台(对于问题和答案来说效果更好,它设计目的是什么),但我认为它不会违反 SO 的规则来尝试将其用于这个不同的目的。

于 2010-06-01T01:22:59.970 回答
0

回溯中的最后两行:

File "...j_report/src/jreport/machinestats.py", line 77, in _make_report_entry
entry_type=record['type']

您现在有两个版本的def _make_report_entry(record):

请注意,回溯的前几行是在喃喃自语decode,而不是 encode 。

第一个/原始版本与该问题有什么关系?

您现在说“因为我的解码函数需要其他对象(例如,'type'、'instance_id' 等),我得到一个 KeyError 异常。”

因此,也许您的解码函数正在被递归调用,并且调用者期望能够处理任何结构,而不仅仅是具有“类型”等的结构。

于 2010-06-01T01:51:55.883 回答