Python - 忽略日志异常

时间:2015-08-11 08:45:33

标签: python exception logging odoo

我有这个方法:

def get_sftp_connection(self, log_error=True):
    self.ensure_one()
    login = self.login_id
    LogCustom = self.env['log.custom']
    try:
        transport = Transport((login.host, login.port))
        transport.connect(username=login.user, password=login.passwd)
        sftp = SFTPClient.from_transport(transport)            
    except socket.gaierror:
        msg = _("Name or service '%s' not known") % (login.host)
        if log_error:
            LogCustom.log_error_event(operation='read', ref=self._get_rec_description(), name=msg)
        raise ValidationError(msg)
    return sftp

如果发生异常,我想在数据库中创建日志记录。但是python / psycopg2似乎回滚了任何更改,因为异常。当我检查是否在raise发生之前创建了日志。它是,但在提高之后,所有东西都会被回滚。

是否可以raise并同时创建登录数据库?就像在一些不同的事务中包装日志创建一样(所以它会避免回滚)

1 个答案:

答案 0 :(得分:0)

如果选中了logging选项,我选择跳过raise,那么我就可以在数据库中创建日志了。虽然我不得不调整代码以期望可以从此方法返回None

这实际上是一种解决方法。如果有更好的完整证明/安全解决方案,请将其作为答案发布。

def get_sftp_connection(self, log_error=True):
    self.ensure_one()
    login = self.login_id
    LogCustom = self.env['log.custom']
    ref = self._get_rec_description()
    try:
        transport = Transport((login.host, login.port))
        transport.connect(username=login.user, password=login.passwd)
        sftp = SFTPClient.from_transport(transport)            
    except socket.gaierror:
        msg = _("Name or service '%s' not known") % (login.host)
        if log_error:
            LogCustom.log_warning_event(operation='read', ref=ref, name=msg)
            return None
        else:
            raise ValidationError(msg)
    return sftp