2026-02-26 15:09:42,575 70933 INFO dev_50fin_0225 odoo.addons.ps_studio.models.handler.service_handler: Jump to Workflow, method svc_std_pre_audit start

2026-02-26 15:13:06,719 70933 INFO dev_50fin_0225 odoo.addons.ps_studio.models.handler.service_handler: Studio svc svc_std_pre_audit start

过程中打印的错误日志,_logger.xxx

2026-02-26 15:24:58,862 70933 ERROR dev_50fin_0225 odoo.sql_db: bad query: SELECT id FROM ar_receivable WHERE id IN (17) FOR UPDATE NOWAIT

ERROR: could not obtain lock on row in relation "ar_receivable"

2026-02-26 15:29:49,638 70933 ERROR dev_50fin_0225 odoo.sql_db: bad query: SELECT value FROM ir_translation

                       WHERE lang='zh_CN' AND type in ('code') AND src=' failed' AND md5(src)=md5(' failed')

ERROR: current transaction is aborted, commands ignored until end of transaction block

2026-02-26 15:32:47,371 70933 ERROR dev_50fin_0225 odoo.sql_db: bad query: SELECT "ir_model_data".id FROM "ir_model_data" WHERE (("ir_model_data"."module" = 'base')  AND  ("ir_model_data"."name" = 'module_ps_ar')) ORDER BY convert_to("ir_model_data"."module", 'GB18030') ,convert_to("ir_model_data"."model", 'GB18030') ,convert_to("ir_model_data"."name", 'GB18030')  

ERROR: current transaction is aborted, commands ignored until end of transaction block

2026-02-26 15:37:14,103 70933 ERROR dev_50fin_0225 odoo.sql_db: bad query:  SELECT r.id FROM ir_rule r JOIN ir_model m ON (r.model_id=m.id)

                    WHERE m.model='ps.workflow.extend' AND r.active=true AND r.perm_read=true

                    AND (r.id IN (SELECT rule_group_id FROM rule_group_rel rg

                                  JOIN res_groups_users_rel gu ON (rg.group_id=gu.gid)

                                  WHERE gu.uid=2)

                         OR r.global=true)

                    ORDER BY r.id

                

ERROR: current transaction is aborted, commands ignored until end of transaction block

2026-02-26 15:37:14,105 70933 ERROR dev_50fin_0225 odoo.sql_db: bad query: SELECT "studio_reference_config".id FROM "studio_reference_config" WHERE ((("studio_reference_config"."model_key" = 'ar.receivable')  AND  ("studio_reference_config"."is_publish" = true))  AND  ("studio_reference_config"."delete_state" = 'normal')) ORDER BY "studio_reference_config"."id"  

ERROR: current transaction is aborted, commands ignored until end of transaction block

2026-02-26 15:37:14,107 70933 ERROR dev_50fin_0225 odoo.sql_db: bad query:  SELECT f.name, d.json_value FROM ir_default d

                    JOIN ir_model_fields f ON d.field_id=f.id

                    JOIN res_users u ON u.id=2

                    WHERE f.model='ar.receivable'

                        AND (d.user_id IS NULL OR d.user_id=u.id)

                        AND (d.company_id IS NULL OR d.company_id=u.company_id)

                        AND d.condition IS NULL

                    ORDER BY d.user_id, d.company_id, d.id

                

ERROR: current transaction is aborted, commands ignored until end of transaction block

2026-02-26 15:37:14,112 70933 ERROR dev_50fin_0225 odoo.sql_db: bad query: SELECT "ar_receivable"."id" as "id" FROM "ar_receivable" WHERE "ar_receivable".id IN (17)

2026-02-26 15:37:14,115 70933 ERROR dev_50fin_0225 odoo.sql_db: bad query: SELECT "ir_model".id FROM "ir_model" LEFT JOIN "ir_translation" as "ir_model_JOINED_name" ON ("ir_model"."id" = "ir_model_JOINED_name"."res_id" AND "ir_model_JOINED_name"."type" = 'model' AND "ir_model_JOINED_name"."name" = 'ir.model,name' AND "ir_model_JOINED_name"."lang" = 'zh_CN' AND "ir_model_JOINED_name"."value" != '') WHERE ("ir_model"."model" = 'ar.receivable') ORDER BY COALESCE("ir_model"."is_mail_thread", False) DESC,convert_to(COALESCE("ir_model_JOINED_name"."value", "ir_model"."name"), 'GB18030') ASC  limit 1

ERROR: current transaction is aborted, commands ignored until end of transaction block

2026-02-26 15:37:14,117 70933 ERROR dev_50fin_0225 odoo.sql_db: bad query: SELECT "ir_model".id FROM "ir_model" LEFT JOIN "ir_translation" as "ir_model_JOINED_name" ON ("ir_model"."id" = "ir_model_JOINED_name"."res_id" AND "ir_model_JOINED_name"."type" = 'model' AND "ir_model_JOINED_name"."name" = 'ir.model,name' AND "ir_model_JOINED_name"."lang" = 'zh_CN' AND "ir_model_JOINED_name"."value" != '') WHERE ("ir_model"."model" = 'mdm.customer') ORDER BY COALESCE("ir_model"."is_mail_thread", False) DESC,convert_to(COALESCE("ir_model_JOINED_name"."value", "ir_model"."name"), 'GB18030') ASC

ERROR: current transaction is aborted, commands ignored until end of transaction block

2026-02-26 15:39:52,497 70933 ERROR dev_50fin_0225 odoo.addons.ps_admin.monkey_patch.http: Exception during JSON request handling.

Traceback (most recent call last):

  File "/opt/projects/insuite/core/odoo/database/postgres/connection.py", line 73, in execute

    res = self._obj.execute(query, params)

psycopg2.errors.LockNotAvailable: could not obtain lock on row in relation "ar_receivable"

During handling of the above exception, another exception occurred:

可视作异常嵌套中的第2级异常

异常发生后不代表程序会终止,取决于上层的捕获和处理策略

Traceback (most recent call last):

  File "/opt/projects/insuite/biz/platform/ps_studio/models/handler/service_handler.py", line 526, in _studio_call_services

    result = ServiceHandler.p_transform_result(func(single_record, *args, **kwargs))

  File "/opt/projects/insuite/biz/platform/ps_studio/models/studio_base.py", line 618, in svc_std_pre_audit

    return self.action_server_run('audit', *args, **kwargs)

  File "/opt/projects/insuite/sys/ps_admin/sys_ele/sys_ele_ctrl.py", line 154, in wrapper

    raise biz_exception

  File "/opt/projects/insuite/sys/ps_admin/sys_ele/sys_ele_ctrl.py", line 143, in wrapper

    result = func(self, *args, **kwargs)

  File "/opt/projects/insuite/biz/platform/ps_doc_base/models/doc_base.py", line 195, in action_server_run

    getattr(self, 'pre_action_run_%s' % opt)(opt, *args, **kwargs)

  File "/opt/projects/insuite/sys/ps_admin/sys_ele/sys_ele_ctrl.py", line 154, in wrapper

    raise biz_exception

  File "/opt/projects/insuite/sys/ps_admin/sys_ele/sys_ele_ctrl.py", line 143, in wrapper

    result = func(self, *args, **kwargs)

  File "/opt/projects/insuite/biz/fin/ps_ar/ar_receivable/development/models/ar_receivable.py", line 1335, in pre_action_run_audit

    sql_obj.p_sql_lock_up('ar_receivable', [res.id])

为什么同一个wrapper方法里的两行代码,会同时出现在堆栈中—— 它们分别对应 “异常重抛点” 和 “异常触发点”,是 Python 为了完整展示异常链路的必要记录。

* 堆栈行顺序逻辑:raise biz_exception在前是因为它是异常最终被主动抛出的位置,result = func(...)在后是因为它是异常最初触发的根源位置,堆栈顺序是 “回溯顺序” 而非 “执行顺序”;

* 同一方法两行共存的原因:装饰器中func行触发原始异常,raise行重抛该异常,Python 会完整记录 “触发 - 捕获 - 重抛” 的链路,因此两行同时出现在堆栈中;

* 核心本质:异常堆栈的核心作用是定位 “异常从哪来、到哪去”,而非记录代码执行的先后,这两行代码恰好分别对应异常的 “来处” 和 “去处”。

  File "/opt/projects/insuite/sys/ps_admin/sys_ele/sys_ele_ctrl.py", line 154, in wrapper

    raise biz_exception

  File "/opt/projects/insuite/sys/ps_admin/sys_ele/sys_ele_ctrl.py", line 143, in wrapper

    result = func(self, *args, **kwargs)

  File "/opt/projects/insuite/biz/platform/ps_doc_base/models/ps_sql.py", line 96, in p_sql_lock_up

    self._cr.execute(sql_lock, param)

  File "/opt/projects/insuite/core/odoo/database/base/connection.py", line 52, in wrapper

    return func(self, *args, **kwargs)

  File "/opt/projects/insuite/core/odoo/database/postgres/connection.py", line 78, in execute

    raise_execption(e, errcode)

  File "/opt/projects/insuite/core/odoo/database/exceptions.py", line 72, in raise_execption

    raise exc_class(msg, error=exc, errcode=errcode)

odoo.database.exceptions.LockNotAvailable: ('could not obtain lock on row in relation "ar_receivable"\n',)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

  File "/opt/projects/insuite/core/odoo/tools/cache.py", line 107, in lookup

    r = d[key]

  File "/opt/projects/insuite/core/odoo/tools/func.py", line 69, in wrapper

    return func(self, *args, **kwargs)

  File "/opt/projects/insuite/core/odoo/tools/lru.py", line 44, in __getitem__

    a = self.d[obj].me

KeyError: ('ir.model.data', <function IrModelData.xmlid_lookup at 0x7fd0dc6ddbf8>, 'base.module_ps_ar')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

  File "/opt/projects/insuite/core/odoo/database/postgres/connection.py", line 73, in execute

    res = self._obj.execute(query, params)

psycopg2.errors.InFailedSqlTransaction: current transaction is aborted, commands ignored until end of transaction block

During handling of the above exception, another exception occurred:

异常嵌套中的第1级异常

Traceback (most recent call last):

异常信息中的最上级文件

  File "/opt/projects/insuite/sys/ps_admin/monkey_patch/http.py", line 42, in _handle_exception

    return super(JsonRequest, self)._handle_exception(exception)

  File "/opt/projects/insuite/core/odoo/http.py", line 314, in _handle_exception

    raise pycompat.reraise(type(exception), exception, sys.exc_info()[2])

  File "/opt/projects/insuite/core/odoo/tools/pycompat.py", line 14, in reraise

    raise value

  File "/opt/projects/insuite/core/odoo/http.py", line 669, in dispatch

    result = self._call_function(**self.params)

  File "/opt/projects/insuite/core/odoo/http.py", line 350, in _call_function

    return checked_call(self.db, *args, **kwargs)

  File "/opt/projects/insuite/core/odoo/service/model.py", line 98, in wrapper

    return f(dbname, *args, **kwargs)

  File "/opt/projects/insuite/core/odoo/http.py", line 343, in checked_call

    result = self.endpoint(*a, **kw)

  File "/opt/projects/insuite/core/odoo/http.py", line 914, in __call__

    return self.method(*args, **kw)

  File "/opt/projects/insuite/core/odoo/http.py", line 515, in response_wrap

    response = f(*args, **kw)

审核按钮绑定的方法svc_std_pre_audit

  File "/opt/projects/insuite/core/addons/web/controllers/main.py", line 1303, in call_button

    action = self._call_kw(model, method, args, kwargs)

  File "/opt/projects/insuite/biz/platform/ps_studio/controllers/studio_dataset_inherit.py", line 63, in _call_kw

    result = super()._call_kw(model, method, args, kwargs)

  File "/opt/projects/insuite/sys/ps_admin/monkey_patch/dataset_inherit.py", line 78, in _call_kw

    return super()._call_kw(model, method, args, kwargs)

  File "/opt/projects/insuite/core/addons/web/controllers/main.py", line 1291, in _call_kw

    return call_kw(request.env[model], method, args, kwargs)

  File "/opt/projects/insuite/core/odoo/api.py", line 410, in call_kw

    result = _call_kw_multi(method, model, args, kwargs)

  File "/opt/projects/insuite/core/odoo/api.py", line 397, in _call_kw_multi

    result = method(recs, *args, **kwargs)

· 审核方法代码

    @allocation_wrapper(biz_name=_('Approve'))

    @sys_ele_ctrl()

    @std_svc(biz_name=_('Approve'))

    def svc_std_pre_audit(self, *args, **kwargs):

        """审核"""

        return self.action_server_run('audit', *args, **kwargs)

· 有时装饰器嵌套较复杂,暂不分析

allocation_wrapper装饰器代码

  File "/opt/projects/insuite/biz/platform/ps_studio/tools/studio_tools.py", line 377, in wrapper

    return func(self, *args, **kwargs)

sys_ele_ctrl装饰器代码

  File "/opt/projects/insuite/sys/ps_admin/sys_ele/sys_ele_ctrl.py", line 154, in wrapper

    raise biz_exception

  File "/opt/projects/insuite/sys/ps_admin/sys_ele/sys_ele_ctrl.py", line 143, in wrapper

    result = func(self, *args, **kwargs)

std_svc装饰器代码

其中调用了p_studio_call_service,所有 call_button 事件入口

  File "/opt/projects/insuite/biz/platform/ps_studio/models/handler/service_handler.py", line 96, in wrapper

    result = service_handler.p_studio_call_service(func, biz_name, raise_exception, func_name, *args, **kwargs)

  File "/opt/projects/insuite/biz/platform/ps_studio/models/handler/service_handler.py", line 143, in p_studio_call_service

    res = self._to_workflow_method(func, true_func_name)

  File "/opt/projects/insuite/biz/platform/ps_studio/models/handler/service_handler.py", line 200, in _to_workflow_method

    return self.model_self.workflow_audit(func=func, function_name="action_server_run")

  File "/opt/projects/insuite/biz/platform/ps_workflow/models/ps_workflow_base.py", line 333, in workflow_audit

    res = _insuite_approve(approve_ids)

  File "/opt/projects/insuite/biz/platform/ps_workflow/models/ps_workflow_base.py", line 308, in _insuite_approve

true_func是<bound method StudioBase.svc_std_pre_audit of ar.receivable(17,)>

    return true_func(ignore_workflow=True)

——再来一遍

· 审核方法代码

    @allocation_wrapper(biz_name=_('Approve'))

    @sys_ele_ctrl()

    @std_svc(biz_name=_('Approve'))

    def svc_std_pre_audit(self, *args, **kwargs):

        """审核"""

        return self.action_server_run('audit', *args, **kwargs)

allocation_wrapper装饰器代码

  File "/opt/projects/insuite/biz/platform/ps_studio/tools/studio_tools.py", line 377, in wrapper

    return func(self, *args, **kwargs)

sys_ele_ctrl装饰器代码

  File "/opt/projects/insuite/sys/ps_admin/sys_ele/sys_ele_ctrl.py", line 154, in wrapper

    raise biz_exception

  File "/opt/projects/insuite/sys/ps_admin/sys_ele/sys_ele_ctrl.py", line 143, in wrapper

    result = func(self, *args, **kwargs)

std_svc装饰器代码

其中调用了p_studio_call_service,所有 call_button 事件入口

  File "/opt/projects/insuite/biz/platform/ps_studio/models/handler/service_handler.py", line 96, in wrapper

    result = service_handler.p_studio_call_service(func, biz_name, raise_exception, func_name, *args, **kwargs)

第二次调用,kwargs是{'ignore_workflow': True},跳过if,执行_studio_call_services

        if self._jump_to_workflow(true_func_name, **kwargs):          

            _logger.info('Jump to Workflow, method {} start'.format(true_func_name))

            res = self._to_workflow_method(func, true_func_name)

            self.call_after_events()

            return res

        _logger.info('Studio svc {} start'.format(true_func_name))

        res = self._studio_call_services(func, biz_name, raise_exception, true_func_name, *args, **kwargs)

  File "/opt/projects/insuite/biz/platform/ps_studio/models/handler/service_handler.py", line 148, in p_studio_call_service

    res = self._studio_call_services(func, biz_name, raise_exception, true_func_name, *args, **kwargs)

_studio_call_services中,执行result = ServiceHandler.p_transform_result(func(single_record, *args, **kwargs))报错,

捕获异常并记录日志

            except (AccessError, UserError, ValidationError, Exception) as e:

                self._log(single_record, 'error')

  File "/opt/projects/insuite/biz/platform/ps_studio/models/handler/service_handler.py", line 577, in _studio_call_services

    self._log(single_record, 'error')

记录日志时需要调用search查询某些信息,但游标已损坏,引发异常嵌套

  File "/opt/projects/insuite/biz/platform/ps_studio/models/handler/service_handler.py", line 1534, in _log

    category=LogCategory.OPERATE

  File "/opt/projects/insuite/sys/ps_admin/biz_log/models/biz_log_item.py", line 84, in __init__

    module_id = cls.env['ir.model.data'].xmlid_to_res_id('base.module_%s' % module)

  File "/opt/projects/insuite/core/odoo/addons/base/models/ir_model.py", line 1672, in xmlid_to_res_id

    return self.xmlid_to_res_model_res_id(xmlid, raise_if_not_found)[1]

  File "/opt/projects/insuite/core/odoo/addons/base/models/ir_model.py", line 1663, in xmlid_to_res_model_res_id

    return self.xmlid_lookup(xmlid)[1:3]

  File "<decorator-gen-65>", line 2, in xmlid_lookup

  File "/opt/projects/insuite/core/odoo/tools/cache.py", line 112, in lookup

    value = d[key] = self.method(*args, **kwargs)

  File "/opt/projects/insuite/core/odoo/addons/base/models/ir_model.py", line 1650, in xmlid_lookup

    xid = self.sudo().search([('module', '=', module), ('name', '=', name)])

  File "/opt/projects/insuite/core/odoo/models.py", line 1676, in search

    res = self._search(args, offset=offset, limit=limit, order=order, count=count)

  File "/opt/projects/insuite/core/odoo/models.py", line 4716, in _search

    self._cr.execute(query_str, where_clause_params)

  File "/opt/projects/insuite/core/odoo/database/base/connection.py", line 52, in wrapper

    return func(self, *args, **kwargs)

  File "/opt/projects/insuite/core/odoo/database/postgres/connection.py", line 78, in execute

    raise_execption(e, errcode)

  File "/opt/projects/insuite/core/odoo/database/exceptions.py", line 80, in raise_execption

    raise DatabaseError(msg,error=exc, errcode=errcode)

odoo.database.exceptions.DatabaseError: ('current transaction is aborted, commands ignored until end of transaction block\n',)

更多推荐