我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

基于pythonsklearn,苏南大叔调试模型得分原理的时候,发现:当分母为零的时候,会引发一个无法捕获的错误提示信息。这种情况该如何处理呢?为什么这个错误信息无法被捕获呢?

苏南大叔:python教程,如何处理捕获不到的分母为零的错误信息? - 分母为零
python教程,如何处理捕获不到的分母为零的错误信息?(图5-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程经验文章。本文分析python语言中,关于捕获分母为零的问题。测试环境:win10python@3.11.0

正常可以捕获

正常情况下,是可以使用try exception来捕获分母为零的异常信息的。

测试代码一:

try:
    s = 168 / 0
except Exception as err:
    print(err)

输出:

division by zero

苏南大叔:python教程,如何处理捕获不到的分母为零的错误信息? - 捕获异常信息
python教程,如何处理捕获不到的分母为零的错误信息?(图5-2)

测试代码二:

try:
    n = 168 / 0.0
except Exception as err:
    print(err)

输出:

float division by zero

相关文章:
https://newsn.net/say/python-try.html

无法捕获的情况

在下面的代码中,运算结果为零的同时,会得到无法捕获的警告提示信息。

测试代码:

import numpy as np
a = np.array([0])
try:
    sn = 168 / a[0]
except Exception as err:
    print(err)
finally:
    print(a[0], type(a[0]))

苏南大叔:python教程,如何处理捕获不到的分母为零的错误信息? - 无法捕获异常一
python教程,如何处理捕获不到的分母为零的错误信息?(图5-3)

或者模拟一下前文中的模型预测得分过程:

import numpy as np
y_true = np.array([0, 1])
y_pred = np.array([1, 1])
tn = sum((y_true == 0) & (y_pred == 0))
try:
    p = 666 / tn
except Exception as err:
    print(err)
finally:
    print(tn, type(tn))

苏南大叔:python教程,如何处理捕获不到的分母为零的错误信息? - 无法捕获异常二
python教程,如何处理捕获不到的分母为零的错误信息?(图5-4)

无法捕获的警告提示信息是:

RuntimeWarning: divide by zero encountered in long_scalars

这两个测试代码的共同特点,

  • 都涉及numpy,分母零的类型都不是普通的int32,是numpy.int32
  • 提示信息的类型是warning警告,并不是exception异常,所以没有被捕获到。
  • 代码并没有停止运行,继续执行了。即使分母为零,最后结果也返回值为零。

解决方案

既然try...exception...不能捕获这个错误警告信息,就最终使用了python的三目运算来解决了这个问题。测试代码:

import numpy as np
s = np.array([0, 1])
n = np.array([1, 1])
tn = sum((s == 0) & (n == 0))
t = 666/tn if (tn>0) else 0
print(t)

苏南大叔:python教程,如何处理捕获不到的分母为零的错误信息? - 三目运算
python教程,如何处理捕获不到的分母为零的错误信息?(图5-5)

相关文章:
https://newsn.net/say/python-if-else.html

结束语

更多python相关文章,请参考苏南大叔的经验总结:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python