学习语言

错误处理

使用试、救与抛处理结构化运行错误并保留调用踪迹。


「所求数据不存在」
 所误 
 所误.代码;
 所误.类别;
 所误.消息;
 所误.踪迹;
 所误.位置;

捕获正文中的运行错误,绑定一个值。.代码.类别用于稳定程序判断,.消息为可读文字,.踪迹为调用帧文字组成的列,.位置为最初失败处的文件:行:列文字;没有源码位置时为

普通运行错误使用代码RUN000、类别运行。网络错误类别为网络,稳定代码如下:

代码含义
NET_PERMISSION宿主或包清单未授予目标网络权限
NET_HEADER自定义请求首部非法、含 CRLF 或试图控制 Host/长度/逐跳语义
NET_URL / NET_DNS地址无效或域名解析失败
NET_CONNECT / NET_TLS连接失败或 TLS 验证/握手失败
NET_TIMEOUT解析、连接、TLS、发送或读取超过全程预算
NET_WRITE / NET_READ请求写入或响应读取失败
NET_LIMIT响应超过大小上限
NET_PROTOCOL / NET_STATUSHTTP 协议/重定向失败或非成功状态
NET_UTF8响应正文不是 UTF-8 文字

请按.代码分支,不要解析.消息。重新抛出已有误会完整保留代码、类别、位置和踪迹。

套接字错误

套接字错误类别为套接字,稳定代码如下:

代码含义
SOCKET_PERMISSION未授予外连network、TCP 监听tcp_listen或 UDP 绑定udp_bind权限,或 DNS 实际 IP 被策略拒绝
SOCKET_ADDRESS / SOCKET_DNS地址格式无效或名称解析失败
SOCKET_CONNECT / SOCKET_BIND / SOCKET_ACCEPTTCP 连接、地址绑定或接受失败
SOCKET_TIMEOUT连接或本次接受/发送/接收超过调用预算
SOCKET_WRITE / SOCKET_READTCP/UDP 写入或读取失败
SOCKET_LIMIT单次接收超限,或同时开放的套接字/监听器超过运行时配额
SOCKET_STATE资源已关闭或成员用于错误的套接字种类
SOCKET_EOF精确读取在取得要求的字节数前遇到 TCP EOF
SOCKET_UTF8收到的字节构成非法 UTF-8;合法但未完整的字符分片会先缓冲
SOCKET_UNSUPPORTED当前平台不提供原生套接字能力

DNS 由操作系统解析器完成,但超时从调用开始计时;DNS、多地址连接尝试与数据传输共用同一截止时间。更多协议和资源语义见套接字

字节错误

字节错误类别为字节BYTES_UTF8表示严格 UTF-8 解码失败,BYTES_LIMIT表示字节串超过 4 MiB,BYTES_RANGE/BYTES_VALUE/BYTES_TYPE表示索引、数列项或参数类型无效,BYTES_RANDOM/BYTES_CRYPTO表示安全随机源或密码操作失败。

普通值会以其显示文字创建错误;已有误值会保留原踪迹。词法、语法和语义错误发生在执行前,不能由捕获。

读取不存在的典键、访问越界下标、类型约束失败和用户主动出的值,都属于可以被捕获的运行错误。

源码级诊断

词法、语法、语义与运行错误使用同一格式,并以全角中文宽度对齐指示符:

运行有误:[RUN000] 不可除以零
  --> 示例.yx:2:7
  |
2 |     归 1 除 0;
  |        ^^^^^^
  经 法“求值”(示例.yx:1:1)

模块中的错误显示规范文件路径;函数调用踪迹包含函数定义位置。捕获后重新同一个误值会保留原始位置与踪迹。