ForcePilot/backend/package/yuxi/storage/transactions/exceptions.py

96 lines
3.0 KiB
Python
Raw Normal View History

"""事务基础设施异常。
定义事务控制链路的稳定错误码与异常类型全部继承自
``yuxi.channels.contract.errors.base.Error``复用 UnifiedError 协议
``status_code`` / ``error_code`` / ``message`` / ``details`` / ``trace_id``
不重新实现协议字段
错误码
- ``TX_BEGIN_ERROR``事务开启失败
- ``TX_COMMIT_ERROR``事务提交失败
- ``TX_ROLLBACK_ERROR``事务回滚失败
- ``TX_INACTIVE_ERROR``事务已关闭时操作
HTTP 状态码四个错误码均未注册到 ``CHANNEL_ERROR_STATUS_MAP``基类
``Error.status_code`` 查表未命中时返回 500
诊断字段每个异常携带 ``transaction_id`` ``session_state``通过覆写
``to_dict()`` 纳入序列化结果基类 ``details`` property ``to_dict()``
提取排除 ``error_code`` / ``message`` / ``trace_id``因此这两个字段
自动进入 ``details``
"""
from __future__ import annotations
from typing import Any
from yuxi.channels.contract.errors.base import Error
class _TransactionError(Error):
"""事务异常内部基类。
为四个事务异常提供共享的 ``transaction_id`` / ``session_state`` 诊断字段
覆写 ``to_dict()`` 将其纳入序列化结果不直接实例化由具体子类继承
复用 ``Error`` 已实现的 UnifiedError 协议``status_code`` / ``details``
"""
def __init__(
self,
message: str,
*,
transaction_id: str = "",
session_state: str = "",
trace_id: str | None = None,
) -> None:
super().__init__(message, trace_id=trace_id)
self.transaction_id = transaction_id
self.session_state = session_state
def to_dict(self) -> dict[str, Any]:
"""序列化为字典,在基础字段外补充事务诊断字段。"""
base = super().to_dict()
base["transaction_id"] = self.transaction_id
base["session_state"] = self.session_state
return base
class TransactionBeginError(_TransactionError):
"""事务开启失败。
``TransactionContext.__aenter__`` ``session.begin()`` 抛错时抛出
``error_code`` ``TX_BEGIN_ERROR``
"""
error_code = "TX_BEGIN_ERROR"
class TransactionCommitError(_TransactionError):
"""事务提交失败。
``commit()`` ``__aexit__`` 提交阶段抛错时抛出
``error_code`` ``TX_COMMIT_ERROR``
"""
error_code = "TX_COMMIT_ERROR"
class TransactionRollbackError(_TransactionError):
"""事务回滚失败。
``rollback()`` ``__aexit__`` 回滚阶段抛错时抛出
``error_code`` ``TX_ROLLBACK_ERROR``
"""
error_code = "TX_ROLLBACK_ERROR"
class TransactionInactiveError(_TransactionError):
"""事务已关闭时操作。
在事务已提交/回滚后再次执行需要活动事务的操作时抛出
``error_code`` ``TX_INACTIVE_ERROR``
"""
error_code = "TX_INACTIVE_ERROR"