You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在函数抛出异常时告知所在的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 18:55:10