Python3.x(beazley):\uuuuuu上下文\uuuuuu vs\uuuuu原因\uuuuuu异常处理中的属性

Python3.x(beazley):\uuuuuu上下文\uuuuuu vs\uuuuu原因\uuuuuu异常处理中的属性,python,python-3.x,Python,Python 3.x,在“链式例外”中,比兹利第626页 try: pass except ValueError as e: raise SyntaxError('foo bar') from e 此处,如果引发ValueError,然后引发SyntaxError…”“e”包含指向ValueError Traceback的原因。他接着说: A more subtle example of exception chaining involves exceptions raised within another

在“链式例外”中,比兹利第626页

try:
  pass
except ValueError as e:
  raise SyntaxError('foo bar') from e
此处,如果引发ValueError,然后引发SyntaxError…”“e”包含指向ValueError Traceback的原因。他接着说:

A more subtle example of exception chaining involves exceptions raised within
another exception handler. For example:
def error(msg):
  print(m)          # Note: typo is intentional (m undefined)
try:
  statements
except ValueError as e:
  error("Couldn't parse configuration")
这里,“error”生成一个意外异常。我不明白的是这一点:

For implicit chaining, the _ _context_ _ attribute of an exception instance 
e contains a reference to previous exception.

为什么他说“e”在
\uuuu上下文中包含对“error”生成的异常的引用??对吗?当然,“error”生成的异常将引用“e”?

您在问题中问了一个问题,在评论中又问了一个单独的问题

关于你在问题中提出的问题:

我不认为“异常实例e”一定是指代码示例中的异常e。它只意味着“处理早期异常时出现的任何异常实例”。因此,该语句只意味着,如果正在处理一个异常(比如说
e1
),并且在处理过程中引发了另一个异常(
e2
),那么
e2
将传播,并且
e2.\uuuuu上下文
将设置为
e1

至于你在评论中的问题,我认为你是误解了。没有“隐式生成异常”。可以是隐式的也可以是显式的是两个异常之间的关系。通过使用
raise。。。从…
中,您可以明确说明两者之间的关系(即,一个是“故意”从另一个创建的)。如果不使用
中的
,则关系是隐式的(第二个关系只是在处理第一个关系的过程中发生的)

它的工作方式是,如果在处理一个异常时引发了一个新异常,那么新异常将在其新异常的
\uuuuuu context\uuuu
属性中包含旧异常。但是,如果新异常包含一个
from
子句(
从旧异常引发新异常
),则新异常将在其
\uuuuuu原因
属性中另外包含旧异常

示例:

>>> try:
...     try:
...         raise ValueError("ValueError")
...     except ValueError as first:
...         raise TypeError("TypeError")
... except TypeError as second:
...     print("The exception was", repr(second))
...     print("Its __context__ was", repr(second.__context__))
...     print("Its __cause__ was", repr(second.__cause__))
The exception was TypeError('TypeError',)
Its __context__ was ValueError('ValueError',)
Its __cause__ was None

>>> try:
...     try:
...         raise ValueError("ValueError")
...     except ValueError as first:
...         raise TypeError("TypeError") from first
... except TypeError as second:
...     print("The exception was", repr(second))
...     print("Its __context__ was", repr(second.__context__))
...     print("Its __cause__ was", repr(second.__cause__))
The exception was TypeError('TypeError',)
Its __context__ was ValueError('ValueError',)
Its __cause__ was ValueError('ValueError',)

你在问题中问了一个问题,在评论中又问了一个问题

关于你在问题中提出的问题:

我不认为“异常实例e”一定是指代码示例中的异常e。它只意味着“处理早期异常时出现的任何异常实例”。因此,该语句只意味着,如果正在处理一个异常(比如说
e1
),并且在处理过程中引发了另一个异常(
e2
),那么
e2
将传播,并且
e2.\uuuuu上下文
将设置为
e1

至于你在评论中的问题,我认为你是误解了。没有“隐式生成异常”。可以是隐式的也可以是显式的是两个异常之间的关系。通过使用
raise。。。从…
中,您可以明确说明两者之间的关系(即,一个是“故意”从另一个创建的)。如果不使用
中的
,则关系是隐式的(第二个关系只是在处理第一个关系的过程中发生的)

它的工作方式是,如果在处理一个异常时引发了一个新异常,那么新异常将在其新异常的
\uuuuuu context\uuuu
属性中包含旧异常。但是,如果新异常包含一个
from
子句(
从旧异常引发新异常
),则新异常将在其
\uuuuuu原因
属性中另外包含旧异常

示例:

>>> try:
...     try:
...         raise ValueError("ValueError")
...     except ValueError as first:
...         raise TypeError("TypeError")
... except TypeError as second:
...     print("The exception was", repr(second))
...     print("Its __context__ was", repr(second.__context__))
...     print("Its __cause__ was", repr(second.__cause__))
The exception was TypeError('TypeError',)
Its __context__ was ValueError('ValueError',)
Its __cause__ was None

>>> try:
...     try:
...         raise ValueError("ValueError")
...     except ValueError as first:
...         raise TypeError("TypeError") from first
... except TypeError as second:
...     print("The exception was", repr(second))
...     print("Its __context__ was", repr(second.__context__))
...     print("Its __cause__ was", repr(second.__cause__))
The exception was TypeError('TypeError',)
Its __context__ was ValueError('ValueError',)
Its __cause__ was ValueError('ValueError',)

你在问题中问了一个问题,在评论中又问了一个问题

关于你在问题中提出的问题:

我不认为“异常实例e”一定是指代码示例中的异常e。它只意味着“处理早期异常时出现的任何异常实例”。因此,该语句只意味着,如果正在处理一个异常(比如说
e1
),并且在处理过程中引发了另一个异常(
e2
),那么
e2
将传播,并且
e2.\uuuuu上下文
将设置为
e1

至于你在评论中的问题,我认为你是误解了。没有“隐式生成异常”。可以是隐式的也可以是显式的是两个异常之间的关系。通过使用
raise。。。从…
中,您可以明确说明两者之间的关系(即,一个是“故意”从另一个创建的)。如果不使用
中的
,则关系是隐式的(第二个关系只是在处理第一个关系的过程中发生的)

它的工作方式是,如果在处理一个异常时引发了一个新异常,那么新异常将在其新异常的
\uuuuuu context\uuuu
属性中包含旧异常。但是,如果新异常包含一个
from
子句(
从旧异常引发新异常
),则新异常将在其
\uuuuuu原因
属性中另外包含旧异常

示例:

>>> try:
...     try:
...         raise ValueError("ValueError")
...     except ValueError as first:
...         raise TypeError("TypeError")
... except TypeError as second:
...     print("The exception was", repr(second))
...     print("Its __context__ was", repr(second.__context__))
...     print("Its __cause__ was", repr(second.__cause__))
The exception was TypeError('TypeError',)
Its __context__ was ValueError('ValueError',)
Its __cause__ was None

>>> try:
...     try:
...         raise ValueError("ValueError")
...     except ValueError as first:
...         raise TypeError("TypeError") from first
... except TypeError as second:
...     print("The exception was", repr(second))
...     print("Its __context__ was", repr(second.__context__))
...     print("Its __cause__ was", repr(second.__cause__))
The exception was TypeError('TypeError',)
Its __context__ was ValueError('ValueError',)
Its __cause__ was ValueError('ValueError',)

你在问题中问了一个问题,在评论中又问了一个问题

关于你在问题中提出的问题:

我不认为“异常实例e”一定是指代码示例中的异常e。它只意味着“处理早期异常时出现的任何异常实例”。因此,该语句只意味着,如果正在处理一个异常(比如说
e1
),并且在处理过程中引发了另一个异常(
e2
),那么
e2
将传播,并且
e2.\uuuuu上下文
将设置为
e1

至于你在评论中的问题,我认为你是误解了。没有“隐式生成异常”。可以是隐式的,也可以是显式的