2013-05-14 65 views
2

我在我的python代码中自定义异常。我继承了异常类中其他现在定义为类从我的自定义异常类派生一些像这样的自定义错误:在python中自定义异常。如何记录错误?

class DataCollectorError(Exception): pass 
class ParamNullError(DataCollectorError) : pass 
class ParamInvalidTypeError(DataCollectorError) : pass 

我养我的Python函数这些异常,如:

def READ_METER_DATA (regIndex, numRegisters, slaveUnit): 
    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" 

    if(isinstance(regIndex, int) == False): 
     raise ParamInvalidTypeError, "register index passed is not int" 

    if(isinstance(numRegisters, int) == False): 
     raise ParamInvalidTypeError, "number of registers passed is not int" 

现在我想使用记录器将错误消息记录到日志文件中,但不知道在哪里做。

  1. 我应该做它通过把该函数的代码在尝试捕捉,但再怎么会我会得到这些错误消息
  2. 我应该做的自定义错误类中,我创建(DataCollectorError
  3. 或个别错误类,如ParamNullError

但是当时我不知道在哪里以及如何得到该错误消息记录它们。

+0

'如果移动到Python 3。不是isinstance(regIndex,int):'是更好的风格,并且总是避免与布尔值进行比较,除非这真是你的意思。而且,这些特定的示例检查看起来更好地被'assert'服务。 – Will 2013-05-14 09:41:55

回答

4

只需使用标准logging module;它会将您的例外开箱即用的例外信息记录下来。

当您的应用程序发现异常时,请使用logging.exception() function进行记录;异常被自动添加到日志条目:

log = logging.getLogger('some-identifier') 

try: 
    # 
except DataCollectorError: 
    log.exception('An error occurred') 

例外都默认一个.args元组参数,并在元组中的第一个值是你的消息。

您的代码风格的一些反馈:

  • 不要测试== False。相反,使用not

    if not isinstance(regIndex, int): 
    
  • 你的异常筹集实例:

    raise ParamNullError("register index is null") 
    

    而非raise class, message风格,使其更容易

+0

我想要那个引发异常的消息。我将如何得到它?我也想问,提出这些异常之后,这段代码将转到下一行或函数将退出? – 2013-05-14 10:03:54

+0

@InderpalSingh:引发异常意味着正常的代码流被中断。在捕捉并处理异常之前,函数立即退出*并且不执行下一行。 – 2013-05-14 10:07:53

+0

@InderpalSingh:你想对异常在[Python的教程]如何工作读了(http://docs.python.org/2/tutorial/errors.html)吧? – 2013-05-14 10:09:04