4

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

しかし、ユニットテストスクリプトがそれを知る前に例外が発生した場合、bczがcatchブロックによってキャッチされているかどうかは不明であるため、これはユニットテストスクリプトの目的を無効にします。だから私はこれらのエラーを基本クラス自体に記録したかった-

Class ParamNullError(DataCollectorError):
    <----here----------->
    pass 

例外の発生中に渡された文字列を取得する方法を教えてもらえますか?

4

2 に答える 2

7

エラークラスを__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=''常にメッセージを指定する必要がないため使用します。

于 2013-05-28T10:00:02.287 に答える
1

しないでください。

単体テストに必要な呼び出しを除外し、例外ハンドラーを移動します。

try:
     testableFunctionCall()
except:
     lgr.exception('Unexpected Error')

とテストtestableFunctionCall()

testfixturesまたは、ライブラリを使用してログ自体をテストします。

from testfixtures import LogCapture
with LogCapture() as l:
    callFunctionUnderTest()

l.check(
     ('packagename', 'ERROR', 'DataCollector Error(READ_METER_DATA): foobar'),
)
于 2013-05-28T10:01:43.183 に答える