Python异常嵌套日志分析
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',)
更多推荐
所有评论(0)