学习语言
错误处理
使用试、救与抛处理结构化运行错误并保留调用踪迹。
试 则
抛「所求数据不存在」;
救 所误 则
言 所误.代码;
言 所误.类别;
言 所误.消息;
言 所误.踪迹;
言 所误.位置;
终试捕获正文中的运行错误,救绑定一个误值。.代码和.类别用于稳定程序判断,.消息为可读文字,.踪迹为调用帧文字组成的列,.位置为最初失败处的文件:行:列文字;没有源码位置时为空。
普通运行错误使用代码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_STATUS | HTTP 协议/重定向失败或非成功状态 |
NET_UTF8 | 响应正文不是 UTF-8 文字 |
请按.代码分支,不要解析.消息。重新抛出已有误会完整保留代码、类别、位置和踪迹。
套接字错误
套接字错误类别为套接字,稳定代码如下:
| 代码 | 含义 |
|---|---|
SOCKET_PERMISSION | 未授予外连network、TCP 监听tcp_listen或 UDP 绑定udp_bind权限,或 DNS 实际 IP 被策略拒绝 |
SOCKET_ADDRESS / SOCKET_DNS | 地址格式无效或名称解析失败 |
SOCKET_CONNECT / SOCKET_BIND / SOCKET_ACCEPT | TCP 连接、地址绑定或接受失败 |
SOCKET_TIMEOUT | 连接或本次接受/发送/接收超过调用预算 |
SOCKET_WRITE / SOCKET_READ | TCP/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)模块中的错误显示规范文件路径;函数调用踪迹包含函数定义位置。捕获后重新抛同一个误值会保留原始位置与踪迹。