1. ホーム
  2. python

[解決済み] 上記例外の処理中に別の例外が発生した

2022-01-30 04:20:08

質問

JSONのパースエラーをキャッチするために、以下のtry-exceptを持っています。

with open(json_file) as j:
    try:
        json_config = json.load(j)
    except ValueError as e:
        raise Exception('Invalid json: {}'.format(e))

なぜ During handling of the above exception, another exception occurred がプリントアウトされるのですが、どうすれば解決できますか?

json.decoder.JSONDecodeError: Expecting ',' delimiter: line 103 column 9 (char 1093)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
<....>
raise Exception('Invalid json: {}'.format(e))
Exception: Invalid json: Expecting ',' delimiter: line 103 column 9 (char 1093)

解決方法は?

現在、この問題を解決するために ValueError 例外を別の捕捉された例外の内部で発生させることができます。この解決策の理由は私にはあまり理解できませんが、もしあなたが

raise Exception('Invalid json: {}'.format(e))

への

raise Exception('Invalid json: {}'.format(e)) from None

エンドコードを作る

with open(json_file) as j:
    try:
        json_config = json.load(j)
    except ValueError as e:
        raise Exception('Invalid json: {}'.format(e)) from None

例外をキャッチするという望ましい結果を得ることができるはずです。

>>> foo = {}
>>> try:
...     var = foo['bar']
... except KeyError:
...     raise KeyError('No key bar in dict foo') from None
...
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
KeyError: 'No key bar in dict foo'

なぜこれがうまくいくのか、具体的な説明はできないのが残念ですが、これでうまくいくようです。

UPDATEしてください。 があるようです。 PEPドキュメント 例外の中の例外の警告を抑制する方法を説明しています。