Skip to main content
 首页 » 编程设计

python之如何区分两个 numpy FloatingPointError 异常

2025年05月04日39mfryf

我不太熟悉 python 中的异常,所以我想在这里解决问题。 numpy 中有两种不同的 FloatingPointError 异常:

import numpy as np 
import sys 
np.seterr(divide='raise', invalid='raise') 
try: 
    np.float64(0.0) / np.float64(0.0) 
except FloatingPointError: 
    tb = sys.exc_info() 
 
print(tb) 
 
(<type 'exceptions.FloatingPointError'>, 
FloatingPointError('invalid value encountered in double_scalars',), 
traceback object at 0x10bd50cb0>) 
 
 
try: 
    np.float64(1.0) / np.float64(0.0) 
except FloatingPointError: 
    tb = sys.exc_info() 
 
print(tb) 
 
(<type 'exceptions.FloatingPointError'>, 
FloatingPointError('divide by zero encountered in double_scalars',), 
traceback object at 0x10faede60>) 

我需要在我的程序中将 0/0 操作定义为 0,这样我应该区分第一个和第二个异常。这是我对问题的解决方案:

if str(tb[1]) == 'invalid value encountered in double_scalars': 
    print('first exception found') 
else: 
    print('second exception found') 

但我想我可以简单地通过比较错误代码或类似的东西来做到这一点。那么如何在 Python 中实现呢?

请您参考如下方法:

最好设置一个error callback function通过numpy.seterr()

class InvalidValueError(Exception): pass 
class DivideByZeroError(Exception): pass 
 
def err_handler(err, flag): 
    if flag == 8: 
        raise InvalidValueError(err) 
    if flag == 1: 
        raise DivideByZeroError(err) 
 
np.seterrcall(err_handler) 
np.seterr(divide='call', invalid='call') 

在这种情况下,您可以根据错误类型TODO 事情。

try: 
    np.float64(0.0) / np.float64(0.0) 
    # or `np.float64(1.0) / np.float64(0.0)` 
except InvalidValueError: 
    # TODO 
except DivideByZeroError: 
    # TODO