我不太熟悉 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
