处理不规则数组时需显式捕获indexerror、typeerror、valueerror和attributeerror;应按场景精准捕获而非宽泛兜底,结合预校验、else/finally提升健壮性与效率。

处理不规则数组(如嵌套深度不一的列表、含 None 或混合类型元素的结构)时,常见异常不是语法错误,而是运行时触发的 IndexError、TypeError、ValueError 和 AttributeError。这些异常必须用 try-except 显式捕获,不能靠调试规避。
识别不规则数组典型报错场景
不规则数组本身合法,但访问逻辑若假设“整齐”,就会出错:
-
IndexError:对某子列表尝试取
[2],但它实际只有 1 个元素 -
TypeError:把字符串当列表遍历(
for x in item:),而item是"abc"或None -
ValueError:用
int()转换嵌套中的字符串"N/A"或空字符串 -
AttributeError:调用
item.append(),但item是数字或字符串
按需捕获具体异常,避免宽泛兜底
不要用空 except: 或 except Exception: —— 它会掩盖真实问题,比如把数据缺失误判为逻辑错误。
- 访问索引前不确定长度?捕获
IndexError并提供默认值:try: val = row[3] except IndexError: val = None - 遍历前不确定是否可迭代?先检查类型,或捕获
TypeError:try: for x in item: ... except TypeError: item = [item] - 数值转换不可信?单独捕获
ValueError:try: num = float(cell) except ValueError: num = 0.0
用 else + finally 提升健壮性
当操作链依赖前序成功时,else 能明确区分“无异常”与“已处理异常”的路径;finally 适合释放临时资源(如中间生成的解析器对象)。
-
else示例:仅当所有字段提取成功,才写入数据库记录 -
finally示例:无论解析是否失败,都关闭临时缓存文件句柄
预校验比异常捕获更高效
对高频访问的不规则结构,提前做轻量级校验比层层 try 更快也更清晰:
- 用
isinstance(item, (list, tuple))替代盲目for循环 - 用
if len(row) > 2:替代直接取row[2] - 用
if cell and isinstance(cell, str) and cell.strip():再转数字











