关于python:在处理上述异常期间,发生了另一个异常

During handling of the above exception, another exception occurred

除了捕获JSON解析错误外,我还尝试了以下操作:

1
2
3
4
5
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,如何解决?

1
2
3
4
5
6
7
8
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异常有问题。这个解决方案的理由对我来说没有多大意义,但如果你改变

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

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

生成您的最终代码。

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

您应该获得捕获异常所需的结果。

例如

1
2
3
4
5
6
7
8
9
>>> 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'

对不起,我不能给你一个解释,为什么这是具体的工作,但它似乎做的诀窍。

更新:似乎有一个PEP文档解释如何在异常警告中抑制这些异常。


由于您在except语句中提出了另一个异常,所以python只是告诉您这一点。

换句话说,通常使用except来处理一个异常,而不是使程序失败,但在这种情况下,您在处理另一个异常的同时又引发了另一个异常,这就是python告诉您的。

如果这是你想要的行为,那真的没什么好担心的。如果您想"摆脱"这条消息,您可以在不引发另一个异常的情况下将某些内容写入输出,或者在不使用try/except语句的情况下使程序第一次停止。

正如史蒂文所建议的,你可以做到:

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

要打印这两个异常,请执行以下操作:

1
2
3
4
5
6
7
8
9
10
Traceback (most recent call last):
  File"tmp.py", line 5, in <module>
    raise Exception('Invalid json: {}'.format(e)) from e
Exception

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  <...>
    json.decoder.JSONDecodeError: Expecting ',' delimiter: line 103 column 9 (char 1093)

或者你可以这样做:

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

抑制第一个异常,只记录Invalid json...异常。

顺便说一句,做一些像raise Exception('Invalid json: {}'.format(e))这样的事情并没有多大意义,此时,您可以将原来的异常单独保留,因为您没有向它添加太多信息。