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

为何Python异常处理无法捕获np.log除零警告并执行print语句

核心原因
  • NumPy默认的数值错误处理策略是输出警告而非抛出Python异常:np.log(0)触发的RuntimeWarning: divide by zero encountered in log只是日志级别的警告,不会触发异常栈,所以try...except块自然捕获不到,print语句也就不会执行。
  • 你贴出的最终报错LinAlgError和你写的这段调试代码无关:从报错栈可以看到,错误触发在indicator.py的price_volume_fit函数内的np.polyfit调用环节,你写的这段逐行计算log的调试代码要么没有实际运行,要么运行后没有捕获到任何异常(因为仅输出警告),程序继续执行到后续拟合环节才因为log(0)产生的-inf值导致线性最小二乘的SVD求解不收敛,最终抛出异常。
解决方法
  • 如果你要让try...except能捕获到NumPy的数值计算错误,可以在代码开头加一行配置,让NumPy把对应警告转为异常:
import numpy as np
np.seterr(divide='raise') # 遇到除以0的情况直接抛出异常

运行这段配置后再执行你写的调试代码,就能正常触发except块打印对应的股票名称和索引。

  • 更高效的定位方式:不需要循环遍历,直接用NumPy向量化操作快速找到成交量为0的位置:
for i, stock in enumerate(df.columns):
    volumes = df[stock].to_numpy()
    zero_indexes = np.where(volumes == 0)[0]
    if len(zero_indexes) > 0:
        print(stock, zero_indexes)
  • 修复根因:后续计算对数前,先对成交量为0的情况做预处理,比如填充极小值、过滤对应行,避免生成-inf值传入拟合函数,就可以解决LinAlgError报错。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:06:03