服务器错误
Neo4j 返回服务器错误,表示 Cypher 查询或命令执行的结果不成功。驱动程序接收这些错误并将其发送给 Neo4j 工具(例如 Browser、Bloom、Cypher Shell)或用户应用程序,由它们将错误显示给用户。
从版本 5.26 开始,Neo4j 错误码除了 Neo4j 异常外,还包含一个额外的 GQL-status 对象,该对象提供关于 Cypher 查询或命令执行状态的信息,并符合 ISO/IEC 39075:2024(en) - 信息技术 - 数据库语言 - GQL 标准。从 Neo4j 5.25 开始,此附加的 GQL-status 对象也会显示在查询日志中。更多信息请参见 操作手册 → GQL 错误信息。
|
当异常没有 GQL-status 对象时,将返回默认的 GQLSTATUS 码 50N42。从 Neo4j 5.25 开始,我们开始向异常添加 GQL 对象。因此,在此过渡期间,您可能会看到许多 50N42 码。然而,重要的是不要依赖此默认码,因为未来的 Neo4j 版本可能会通过向异常添加适当的 GQL 对象来更改它。此外,外部过程的 GQL 码尚不稳定。 |
本页面描述了用于错误的 GQL-status 和 Neo4j-status 对象框架,包括它们的结构、提供的错误对象以及如何解释它们。它还解释了错误内部机制以及 GQLSTATUS 和错误的服务器-驱动程序兼容性。
GQL-status 错误对象
在 GQL-status 对象框架中,当用户向服务器执行查询时,总是会产生一个结果,称为执行结果。如果在执行期间发生错误,该结果会记录为异常条件,表示执行失败且没有结果。错误的执行结果表示为一个 GQL-status 对象列表,这些对象具有失败的结果,并按照以下优先级规则组织:
-
导致事务回滚的每个异常优先于其他异常。
-
每个异常都优先于任何完成条件。有关完成条件,请参阅GQL-status 通知对象。
GQL-status 对象还包括 Neo4j 特定的信息,例如严重级别和错误分类。
每个 GQL-status 对象包含以下字段:
GQLSTATUS 码 |
一个 5 个字符的字符串,由 2 个字符的类码和 3 个字符的子类码连接而成,用于标识错误的条件。 |
||||||||||||
StatusDescription |
GQLSTATUS 的人类可读描述,由一个条件、一个子条件以及关于该条件的额外可选文本组成。格式为 |
||||||||||||
DiagnosticRecord |
关于状态的额外信息,以键值对的形式给出,包括服务器端和驱动程序端。要检索完整的诊断记录,您可以在服务器端使用
|
GQL-status 错误对象还可以包含一个可选的 GQL-status 对象,该对象表示错误的根本原因,用于提供额外的、更具体的诊断信息。
GQLSTATUS 错误码类别
GQLSTATUS 码分为类别和子类别。类码是一个 2 个字符的字符串,表示状态的一般条件,例如连接异常、数据异常等。子类码是一个 3 个字符的字符串,提供有关该条件的更详细信息。
下表列出了 GQLSTATUS 类别及其含义:
类别 |
条件 |
08 |
连接异常 |
22 |
数据异常 |
25 |
无效事务状态 |
40 |
事务回滚 |
42 |
语法错误或访问规则违规 |
50 |
一般处理异常 |
51 |
系统配置或操作异常 |
52 |
过程异常 |
Neo4j-status 错误对象
Neo4j-status 错误对象包含诊断信息,表示 Cypher 查询或命令执行的不成功结果,包括严重性、状态码、类别、描述、消息以及错误在查询文本中相关的位置。根据应用程序的不同,错误对象中的某些字段可能不可见。
错误对象包含以下字段:
Neo4j 码 |
采用 |
描述 |
特定错误的描述。 |
Message |
错误消息。 |
Severity level |
|
Category |
错误的类别。可用类别包括 |
Position |
(可选) 错误在查询文本中相关的位置,由偏移量、行和列给出。 |
更多信息请参见Neo4j 错误码列表。
服务器错误类型
服务器返回错误并不总是意味着这是致命错误。状态码也可能指示瞬时问题,这些问题在重试请求后可能会消失。服务器错误组决定了对事务的影响。
| 类型 | 描述 | 对事务的影响 |
|---|---|---|
|
这些错误由客户端(用户输入或用户应用程序)引起,通常与请求本身有关。更改请求可能会成功。Neo4j 码具有前缀 |
回滚 |
|
这些错误由服务器检测到,通常与某种数据库不可用相关,例如达到限制、内存不足、超时等。错误可能是临时的,因此稍后重试可能会成功。Neo4j 码具有前缀 |
回滚 |
|
这些错误由数据库引起,通常与数据库状态相关,表示数据库未能处理请求。Neo4j 码具有前缀 |
回滚 |
错误内部机制
Neo4j 支持以 Java 异常形式表示的服务器错误。大多数异常实现了 HasStatus 接口,这意味着它们除了异常消息外,还有一个状态码。
在服务器端,异常包含普通的 Java 构造函数和方法,如 getMessage()、getCause() 等,此外还包含 HasStatus API 中的 status() 方法,该方法返回状态码。
异常还增加了新的强制字段 gqlStatus、statusDescription、diagnosticRecord,以及一个可选的 cause 字段。cause 字段本身也有自己的 GQLSTATUS、状态描述、诊断记录和消息。
保留了 getMessage() 方法,因为 Java 异常固有地具有此方法。并添加了一个新的分类字段,以涵盖客户端错误、瞬时错误和数据库错误的划分,这些划分目前是 Neo4j 码的一部分。所有这些字段构建了 GQLSTATUS 对象,该对象作为 Failure Bolt 消息的一部分发送给驱动程序。具体外观取决于驱动程序和服务器版本的组合。更多信息请参见服务器-驱动程序版本兼容性。
在驱动程序端,Neo4jException 扩展了与服务器端对应的方法。驱动程序接收 Failure Bolt 消息并提取状态码和错误消息。然后,它构建一个包含状态码、错误消息和其他相关信息的异常,并将其发送给客户端。
查询日志
由于查询日志位于服务器端且作用于整个 DBMS,连接到同一 DBMS 的多个客户端会写入同一个查询日志。由于客户端可能使用不同的驱动程序版本,因此它们可能具有不同的错误框架格式。
在 Neo4j 5.25 中,查询日志的默认 JSON 模板已更新,包含一个 errorInfo 条目。此条目包含 GQLSTATUS、statusDescription、classification、position(如果适用)和 cause(如果适用),其内容与错误对象中的条目相同。
服务器-驱动程序版本兼容性
服务器和驱动程序通过 Bolt 协议相互通信。在握手过程中,它们会协商使用服务器和驱动程序都支持的最新 Bolt 协议版本。有关不同服务器版本支持的 Bolt 版本,请参阅Bolt 协议文档。
Neo4j 服务器版本 5.25 及更高版本在 JSON 格式的查询日志中提供了带有附加 GQL-status 错误对象的新错误框架。Bolt 协议自 5.7 版本起支持此功能,该版本对应于服务器端和驱动程序端的 5.26 或更高版本。
要充分利用新错误框架,您的服务器和驱动程序都必须支持它。版本低于 5.26 的驱动程序不会为异常发送任何 GQL-status 对象,即使服务器版本是 5.26 或更高。
如果版本 5.26 或更高版本的驱动程序与版本低于 5.26 的服务器通信,驱动程序需要使用 GQL-status 对象对异常进行填充。在这种情况下,所有异常都将返回默认的 GQLSTATUS 码 50N42。
驱动程序版本 5.25 或更旧 |
驱动程序版本 5.26 或更新 |
|
|---|---|---|
服务器版本 5.24 或更旧 |
Bolt: 现有错误信息 查询日志: 现有错误信息 |
Bolt: 带有默认值的附加 GQL-status 对象 查询日志: 现有错误信息 |
服务器版本 5.25 |
Bolt: 现有错误信息 查询日志: 附加 errorInfo 条目 |
Bolt: 带有默认值的附加 GQL-status 对象 查询日志: 附加 errorInfo 条目 |
服务器版本 5.26 或更新 |
Bolt: 现有错误信息 查询日志: 附加 errorInfo 条目 |
Bolt: 附加 GQL-status 对象 查询日志: 附加 errorInfo 条目 |