为何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
相关产品推荐
相关产品推荐

