服务器错误
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 条目 |