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

に渡すものをコピーして貼り付け、それを(Python 2.6 の an の後)self.json_encodeの引数として使用すると、問題なく動作します。したがって、バグはあなたが私たちに見せていないメソッドにあるようです: 呼び出すだけでなく、他に何をしますか? (もちろん、Python < 2.6 を使用している場合)。json.dumpsimport jsonjson_encodejson.dumpssimplejson.dumps

編集:使用json_encode = json.JSONEncoder().encode(OPが投稿しsimplejsonたように、可能性として述べたように古いものを使用していることを除いて)も正常に機能します。Qの大規模な編集の一部としても投稿された不完全なスタックトレースは、おそらく何らかのモデルの誤用によって、エラーがデコード部分に発生することを示唆しています(モデルが表示されないためわかりません)-OPとして彼は現在、より多くの情報を投稿していると述べていますが、問題をデバッグするにはまだ十分ではありません.

これは、最後の段階的な単純化によってバグが消えるまで、OP が問題を少しずつ単純化しようとする価値があることを強く示唆しています。バグを再現する最も簡単な方法と、コードのごくわずかなイプシロンがさらに削除されるとバグが消えるという情報を投稿することは、私たちのような「サードパーティのオブザーバー」がデバッグを支援するのに役立つ場合があります。SOは実際には集団デバッグ用に設計されたプラットフォームではありません(質問と回答、それ設計された目的によりうまく機能します)が、この別の目的でそれを使用しようとすることでSOのルールに違反するとは思いません.

于 2010-06-01T01:22:59.970 に答える
0

トレースバックの最後の 2 行:

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

の2 つのバージョンがあります。def _make_report_entry(record):

トレースバックの最初の数行は、エンコードではなく、デコードについてつぶやいていることに注意してください。

最初/オリジナルのバージョンは問題とどのような関係がありますか?

「デコード関数が他のオブジェクト (たとえば、'type'、'instance_id' など) を予期しているため、KeyError 例外が発生します。」

したがって、おそらくあなたのデコード関数は再帰的に呼び出されており、呼び出し元は「タイプ」などを持つ構造だけでなく、あらゆる構造を処理できることが期待されています.

于 2010-06-01T01:51:55.883 に答える