Python3.x(beazley):\uuuuuu上下文\uuuuuu vs\uuuuu原因\uuuuuu异常处理中的属性
在“链式例外”中,比兹利第626页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
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
至于你在评论中的问题,我认为你是误解了。没有“隐式生成异常”。可以是隐式的,也可以是显式的