在python中自定义异常? 在自定义异常类中写入日志?

Customizing exceptions in python? writing logs in custom exception class?

我在我的python代码中定制异常。 我已将异常类继承到其他类,现在将一些自定义错误定义为从我的自定义异常类派生的类,如下所示:

1
2
3
class DataCollectorError(Exception): pass
class ParamNullError(DataCollectorError) : pass
class ParamInvalidTypeError(DataCollectorError) : pass

我在我的python函数中提出这些异常,如:

1
2
3
4
5
6
7
8
9
10
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"

和记录错误如:

1
2
3
4
5
6
7
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

但是这会破坏单元测试脚本的目的,因为它不会在我的单元测试脚本知道之前是否异常引发bcz它被我的catch块捕获。 所以我想在基类本身记录这些错误 -

1
2
3
Class ParamNullError(DataCollectorError):
    <----here----------->
    pass

任何人都可以告诉我如何在提出异常时获取传递的字符串?


只需使用__init____str__方法扩展错误类。

例:

1
2
3
4
5
6
7
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
2
3
4
try:
     testableFunctionCall()
except:
     lgr.exception('Unexpected Error')

并测试testableFunctionCall()

或者,使用testfixtures库来测试日志记录本身:

1
2
3
4
5
6
7
from testfixtures import LogCapture
with LogCapture() as l:
    callFunctionUnderTest()

l.check(
     ('packagename', 'ERROR', 'DataCollector Error(READ_METER_DATA): foobar'),
)