例如这段代码:
def foo():
x = 5
raise
def bar():
try:
foo()
except:
# access x here
Run Code Online (Sandbox Code Playgroud)
是否可以以某种方式访问 x ?谢谢。
根据您的用例,更明智的方法是创建自定义异常并为其提供数据:
class MyException(Exception):
def __init__(self, x, *args, **kwargs):
super().__init__(*args, **kwargs)
self.x = x
def foo():
x = 5
raise MyException(x)
def bar():
try:
foo()
except MyException as e:
print(e.x)
Run Code Online (Sandbox Code Playgroud)
如果您确实需要能够访问所有局部变量,则可以遍历异常的回溯以检索每个堆栈帧的局部变量。这是一个适合您的特定示例的简单示例:
def bar():
try:
foo()
except Exception as e: # BaseException if you want to catch *everything*
frame = e.__traceback__.tb_next.tb_frame
print(frame.f_locals["x"])
Run Code Online (Sandbox Code Playgroud)
通常,下一帧不一定是引发异常的帧。您可以遍历直到到达该框架,如下所示:
import traceback
def bar():
try:
foo()
except Exception as e:
# Get the last frame yielded, which will be where the exception was raised.
*_, (frame, _) = traceback.walk_tb(e.__traceback__)
print(frame.f_locals["x"])
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
104 次 |
最近记录: |