我在我的python代码中定制异常。我已将异常类继承到其他类,现在将一些自定义错误定义为从我的自定义异常类派生的类,如下所示:
class DataCollectorError(Exception): pass
class ParamNullError(DataCollectorError) : pass
class ParamInvalidTypeError(DataCollectorError) : pass
我在我的python函数中提出这些异常,如:
def READ_METER_DATA (regIndex, numRegisters, slaveUnit):
try:
if not regIndex:
raise ParamNullError, "register index is null"
if not numRegisters:
raise ParamNullError, "number of registers should not be null"
if not slaveUnit:
raise ParamNullError, "Meter Id should not be null"
并记录错误,如:
except DataCollectorError as d:
lgr.error('DataCollector Error(READ_METER_DATA): '+d.args[0])
print 'DataCollector Error:(READ_METER_DATA)', d.args[0]
except:
lgr.error('Unexpected Error: ', sys.exc_info())
print 'Unexpected Error: ', sys.exc_info()
pass
但是这会破坏单元测试脚本的目的,因为它不会引发异常,因为在我的单元测试脚本知道它之前我的catch块正在捕获它。所以我想在基类本身记录这些错误 -
Class ParamNullError(DataCollectorError):
<----here----------->
pass
有人能告诉我如何在提出异常时获取传递的字符串吗?
答案 0 :(得分:3)
只需使用__init__
和__str__
方法扩展错误级别。
示例:
class DataCollectorError(Exception):
def __init__(self, msg=''):
self.msg = msg
log(msg) # use your logging things here
def __str__(self):
return self.msg
使用msg=''
因为您无需始终指定消息。
答案 1 :(得分:1)
别。
将您需要进行单元测试的调用分解出来,然后移出异常处理程序:
try:
testableFunctionCall()
except:
lgr.exception('Unexpected Error')
并测试testableFunctionCall()
。
或者,使用testfixtures
library来测试日志记录本身:
from testfixtures import LogCapture
with LogCapture() as l:
callFunctionUnderTest()
l.check(
('packagename', 'ERROR', 'DataCollector Error(READ_METER_DATA): foobar'),
)