如何在函数抛出异常时告知所在的Y、X循环位置?
可行,给你两种实用实现方法
方法一:在循环层捕获异常并补充位置信息
不用修改function_A和function_B的参数,直接在assign_points的嵌套循环里捕获B抛出的异常,把当前的Y、X位置追加到异常信息里再重新抛出。这样既保留了原始错误的上下文,又能看到出错的具体位置。
示例代码:
def assign_points(lists): for y, row in enumerate(lists): for x, item in enumerate(row): try: function_A(item) except ValueError as e: # 把位置信息拼到异常消息里,用from e保留原始调用栈 raise ValueError(f"位置(Y={y}, X={x})出错: {e}") from e def function_A(item): function_B(item) def function_B(item): if item < 0: raise ValueError("数值不能为负")
方法二:用线程局部存储传递位置信息
如果不想在循环里加try-except块,可以用线程局部变量临时存储当前的Y、X索引,function_B抛出异常时直接读取这个变量就行,完全不用额外传参数。
示例代码:
import threading # 创建线程局部存储对象,不同线程的变量互不干扰 thread_local = threading.local() def assign_points(lists): for y, row in enumerate(lists): for x, item in enumerate(row): # 把当前位置存到线程局部变量 thread_local.current_pos = (y, x) function_A(item) def function_A(item): function_B(item) def function_B(item): if item < 0: y, x = thread_local.current_pos raise ValueError(f"位置(Y={y}, X={x})出错: 数值不能为负")
单线程环境下用普通全局变量也能实现,但线程局部存储更安全,多线程场景下不会出现位置错乱的问题。
内容的提问来源于stack exchange,提问作者MiguelP
相关产品推荐
相关产品推荐

