# 0Z002 — stacked_diagnostics_accessed_without_active_handler

> PostgreSQL SQLSTATE 0Z002 的源码与诊断参考。
---

# 0Z002

## 速览 {#at-a-glance}

SQLSTATE 0Z002 在 PL/pgSQL 代码试图使用堆叠异常状态、但不存在拥有该状态的活动异常处理器时报告。PostgreSQL 18.6 已确认两条路径：`GET STACKED DIAGNOSTICS cannot be used outside an exception handler` 和 `RAISE without parameters cannot be used outside an exception handler`，两者均为 ERROR。

<!-- BEGIN SQLSTATE FACTS: generated by scripts/generate.py; do not edit -->

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `0Z002` |
| 条件名 | `stacked_diagnostics_accessed_without_active_handler` |
| 状态 | `有效` |
| 已知存在于 | `9.2.0` |
| 锁定快照 | `9.2.24, 9.3.25, 9.4.26, 9.5.25, 9.6.24, 10.23, 11.22, 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3` |
| 宏 | `ERRCODE_STACKED_DIAGNOSTICS_ACCESSED_WITHOUT_ACTIVE_HANDLER` |
| 别名 | `—` |

<!-- source facts: data/errcodes/0Z002.json -->
<!-- END SQLSTATE FACTS -->

## 含义 {#meaning}

第一条路径保护 `GET STACKED DIAGNOSTICS`；第二条路径保护本应重新抛出当前异常的无参数 `RAISE`。共同边界是 PL/pgSQL 的 `EXCEPTION` 处理器，而不是 SQL 的 `BEGIN`/`COMMIT` 事务块。该成员码比 0Z000 类别更具体。

## 消息 {#messages}

固定消息是 `GET STACKED DIAGNOSTICS cannot be used outside an exception handler` 和 `RAISE without parameters cannot be used outside an exception handler`。

## 诊断 {#diagnosis}

定位失败的 PL/pgSQL 语句及最近的 `EXCEPTION` 块。`GET STACKED DIAGNOSTICS` 读取正在处理的异常，无参数 `RAISE` 重新抛出该异常；处理器外不存在可用的堆叠状态。保留准确消息和 routine context，因为事务状态错误或新的显式 `RAISE` 属于不同原因。

## 处理 {#response}

把诊断读取或重新抛出移到活动异常处理器中；如果当前没有正在处理的异常，就使用带明确条件/消息的 `RAISE`。处理器应保持足够窄，并在离开前保留 `RETURNED_SQLSTATE`、消息、detail 和 hint。该路径支持的是代码修正，而不是事务重试。

## 版本 {#versions}

锁定目录将该条件的已知下界记为 PostgreSQL 9.2.0。事实块列出已发布快照；源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

## 相关 {#related}

[`0Z000`](../0z000/), [`P0001`](../p0001/)

## 来源 {#sources}

固定的 [PL/pgSQL 执行器源码](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/pl/plpgsql/src/pl_exec.c#L2421-L2423)报告 GET STACKED DIAGNOSTICS 变体，[RAISE 路径](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/pl/plpgsql/src/pl_exec.c#L3747-L3749)报告无参数变体。[PL/pgSQL 诊断文档](https://www.postgresql.org/docs/18/plpgsql-control-structures.html#PLPGSQL-GET-DIAGNOSTICS)说明堆叠字段。 详见结构化[证据记录](../../data/evidence/0z002.json)，其中记录固定源码路径、扫描范围和未解决的运行边界。
