各类错误码详解
错误码是技术系统中用于标准化问题定位的重要工具,不同领域(如网络、操作系统、数据库、编程语言等)有各自的错误码体系。以下从通用场景到具体领域,详细梳理常见错误码的含义、触发场景及典型应用:
错误码是技术系统的“问题语言”,不同领域的错误码服务于特定场景:
HTTP 状态码:解决 Web 通信中的通用问题(如 404 资源不存在)。系统错误码:定位底层操作异常(如 Linux 的 ENOENT 表示文件不存在)。编程语言错误码:封装系统或应用层问题(如 Python 的 FileNotFoundError)。数据库错误码:标识 SQL 操作异常(如 MySQL 的 1062 唯一键冲突)。自定义错误码:明确业务逻辑问题(如电商系统的“库存不足”)。
一、HTTP 状态码(Web 通信)
HTTP 状态码是 Web 开发中最通用的错误标识,由 3 位数字组成,分为 5 大类(1xx-5xx),其中“找不到”相关的核心状态码是 404,其他常见错误码如下:
状态码名称含义典型场景100Continue客户端应继续发送请求(用于上传大文件时的分块请求)前端上传文件时,服务器确认接收部分数据,要求继续上传剩余部分。200OK请求成功正常接口响应(如查询数据成功)。201Created资源创建成功POST 请求创建新用户后返回。301Moved Permanently资源永久重定向原 URL 已永久失效,跳转到新 URL(如域名变更)。302Found资源临时重定向原 URL 临时指向其他地址(如活动页面跳转)。304Not Modified资源未修改(缓存有效)客户端使用 If-None-Match 头请求缓存资源,服务器确认未修改。400Bad Request客户端请求语法错误提交表单时字段缺失或格式错误(如邮箱格式不正确)。401Unauthorized未认证(需要登录)访问需要登录的接口但未携带 Token。403Forbidden认证通过但无权限登录用户尝试访问管理员专属接口(权限不足)。404Not Found资源不存在访问已删除的网页(如 https://example.com/old-page)。405Method Not Allowed请求方法不允许对只读接口使用 POST 方法(如 GET 接口调用 POST)。408Request Timeout请求超时客户端长时间未发送数据(如上传文件超时)。409Conflict资源冲突尝试创建已存在的用户名(唯一约束冲突)。500Internal Server Error服务器内部错误后端代码抛出未捕获异常(如数据库连接失败)。501Not Implemented服务器不支持该功能调用未实现的 API 接口(如旧版本不支持新功能)。502Bad Gateway网关错误(上游服务器无响应)Nginx 作为网关时,后端应用服务器崩溃或超时。503Service Unavailable服务不可用(过载或维护)服务器因高并发暂时拒绝请求(如双 11 大促期间)。504Gateway Timeout网关超时(上游服务器响应过慢)网关等待上游服务器响应超过设定时间(如数据库查询耗时过长)。
二、操作系统错误码
操作系统在文件操作、进程管理等底层操作中,通过错误码(Errno)标识具体问题。不同系统的错误码定义不同,以下是主流系统的常见错误码:
1. Linux/macOS(POSIX 标准)
错误码以宏定义形式存在于
错误码(数值)名称(宏)含义触发场景1EPERM操作不允许(权限不足)尝试修改只读文件(如 chmod 444 file.txt 后执行 echo "a" >> file.txt)。2ENOENT文件/目录不存在访问不存在的文件(如 open("/nonexistent.txt", O_RDONLY))。3ESRCH进程不存在发送信号给已终止的进程(如 kill -9 99999,99999 是不存在的 PID)。13EACCES权限拒绝尝试写入无写权限的目录(如 /root 目录)。17EEXIST文件/目录已存在创建已存在的文件(如 mkdir("existing_dir"))。22EINVAL参数无效传递非法参数(如 lseek(fd, -100, SEEK_SET) 但文件大小小于 100)。30EROFS只读文件系统尝试写入挂载为只读的磁盘分区(如 mount -o ro /dev/sda1 /mnt 后写入)。54ECONNREFUSED连接被拒绝尝试连接未监听的端口(如 telnet localhost 9999,但 9999 端口无服务)。
2. Windows 系统
Windows 错误码是 32 位数值,可通过 GetLastError() 函数获取,部分常见错误码:
错误码(十六进制)名称含义触发场景0x2ERROR_FILE_NOT_FOUND文件不存在调用 CreateFile("C:\\nonexistent.txt", ...) 时文件不存在。0x3ERROR_PATH_NOT_FOUND路径不存在访问不存在的目录(如 \\invalid-server\share\file.txt)。0x5ERROR_ACCESS_DENIED访问被拒绝尝试修改系统文件(如 C:\Windows\system32\config\sam)。0x27ERROR_DISK_FULL磁盘空间不足向剩余空间为 0 的磁盘写入文件。0x35ERROR_BAD_NET_NAME网络名称无效访问不存在的网络共享(如 \\wrong-server\share)。0x57ERROR_INVALID_PARAMETER参数无效传递非法参数(如 CreateFile 的 dwCreationDisposition 参数错误)。
三、编程语言错误码
不同编程语言会封装系统错误码,或自定义错误类型,以下是主流语言的典型错误表示:
1. Python
Python 通过异常类表示错误,部分内置异常对应系统错误码:
异常类对应系统错误码含义示例场景FileNotFoundErrorENOENT (2)文件/目录不存在open("nonexistent.txt", "r")。PermissionErrorEACCES (13)权限拒绝os.remove("/root/file.txt")(无写权限)。IsADirectoryErrorEISDIR (21)操作对象是目录而非文件open("/home/user", "r")(/home/user 是目录)。ConnectionRefusedErrorECONNREFUSED (61)连接被拒绝socket.connect(("localhost", 9999))(端口未监听)。
2. Node.js(JavaScript)
Node.js 的 Error 对象通过 code 属性标识系统错误码(字符串形式):
code 字段值对应系统错误码含义示例场景'ENOENT'ENOENT (2)文件/目录不存在fs.readFile("nonexistent.txt", (err) => ...) 抛出错误。'EACCES'EACCES (13)权限拒绝fs.writeFile("/root/file.txt", "data")(无写权限)。'ECONNREFUSED'ECONNREFUSED (61)连接被拒绝net.connect({ port: 9999 }, () => ...)(端口未监听)。'EINVAL'EINVAL (22)参数无效fs.read(fd, buffer, 0, -100, 0, (err) => ...)(负的读取长度)。
3. Java
Java 通过异常类表示错误,部分异常对应系统或应用层问题:
异常类含义示例场景FileNotFoundException文件不存在new FileInputStream("nonexistent.txt")。IllegalAccessException无权限访问类/方法反射调用私有方法时未设置 setAccessible(true)。SQLException(SQL 错误)数据库操作错误(需结合 SQLState 或错误码)执行 INSERT 时违反唯一约束(如 MySQL 错误码 1062)。
4. C/C++
C/C++ 直接使用系统错误码(通过 errno 变量或 GetLastError()),常见错误码与 POSIX 兼容:
错误码(数值)含义示例场景EINVAL (22)参数无效pthread_create(NULL, NULL, NULL, NULL)(线程属性参数非法)。ENOMEM (12)内存不足malloc(SIZE_MAX)(尝试分配超过系统可用内存的空间)。ECONNRESET (104)连接被重置TCP 连接被对端强制关闭(如 recv() 返回 -1 且 errno=ECONNRESET)。
四、数据库错误码
数据库错误码用于标识 SQL 操作中的问题,不同数据库的错误码体系不同:
1. MySQL
MySQL 错误码为 4 位数字(如 1062),可通过 SHOW ERRORS 查看:
错误码名称含义示例场景1062ER_DUP_ENTRY唯一键冲突(重复插入)插入已存在的用户名(UNIQUE 约束)。1146ER_NO_SUCH_TABLE表不存在执行 SELECT * FROM non_existent_table。1045ER_ACCESS_DENIED_ERROR访问被拒绝(用户名/密码错误)使用错误的密码连接 MySQL。1213ER_LOCK_DEADLOCK死锁两个事务互相等待对方释放锁。
2. PostgreSQL
PostgreSQL 错误码为 5 字符字符串(如 23505),属于 SQLSTATE 标准:
错误码名称含义示例场景23505unique_violation唯一键冲突插入重复的邮箱(UNIQUE 约束)。42P01undefined_table表不存在执行 SELECT * FROM non_existent_table。28P01invalid_password_authentication密码认证失败使用错误的密码登录数据库。40001serialization_failure序列化失败(事务冲突)两个事务同时修改同一行,导致其中一个无法提交。
3. Oracle
Oracle 错误码为 5 位数字(如 ORA-00001),通过 SQLERRM 获取描述:
错误码名称含义示例场景ORA-00001unique constraint violated唯一键冲突插入重复的主键值。ORA-00942table or view does not exist表或视图不存在查询不存在的表 SELECT * FROM emp(实际表名是 employees)。ORA-12514tns:listener does not currently know of service requested监听程序未注册服务连接 Oracle 时服务名错误(如 tnsnames.ora 中配置的服务名与实际不符)。
五、网络与底层错误码
网络编程中,错误码用于标识套接字(Socket)、连接等操作的异常:
1. Socket 错误码(Linux)
通过 errno 变量获取,常见网络相关错误码:
错误码(数值)名称(宏)含义触发场景11EAGAIN/EWOULDBLOCK操作会阻塞(非阻塞模式下无数据可读/写)调用 recv() 但当前无数据到达(非阻塞模式)。110ETIMEDOUT连接超时connect() 时对端无响应(超过 SO_SNDTIMEO 设定的时间)。104ECONNRESET连接被重置对端突然关闭连接(如 kill -9 终止进程)。99EADDRNOTAVAIL地址不可用绑定未配置的本地 IP(如 bind("192.168.1.100", 8080) 但网卡无此 IP)。
2. ICMP 错误码(网络层)
ICMP(互联网控制消息协议)用于传递网络状态信息,常见错误码:
类型(Type)代码(Code)含义触发场景30目标网络不可达访问的 IP 所在网络不存在路由(如 ping 192.168.2.100 但网关无此路由)。33目标端口不可达TCP 连接时目标端口未监听(如 telnet 192.168.1.1 9999,9999 端口无服务)。50重定向(路由优化)路由器通知主机更优的下一跳地址。
六、自定义错误码(业务系统)
在自研系统或接口中,通常需要自定义错误码以明确业务问题。设计原则:
唯一性:每个错误码对应唯一问题。可读性:通过编号或枚举值明确含义(如 1001 表示“用户不存在”)。文档化:提供错误码说明文档,方便前后端协作。
示例:电商系统自定义错误码
错误码含义触发场景1001用户ID不存在调用 GET /users/9999 时,用户表中无 ID=9999 的记录。1002商品库存不足下单时商品库存为 0(如 POST /order 请求购买数量超过库存)。2001订单已支付尝试重复支付已完成的订单(如 POST /pay/123 但订单状态为“已支付”)。3001支付接口超时调用支付宝/微信支付接口超过 5 秒未返回结果。
总结
错误码是技术系统的“问题语言”,不同领域的错误码服务于特定场景:
HTTP 状态码:解决 Web 通信中的通用问题(如 404 资源不存在)。系统错误码:定位底层操作异常(如 Linux 的 ENOENT 表示文件不存在)。编程语言错误码:封装系统或应用层问题(如 Python 的 FileNotFoundError)。数据库错误码:标识 SQL 操作异常(如 MySQL 的 1062 唯一键冲突)。自定义错误码:明确业务逻辑问题(如电商系统的“库存不足”)。
理解错误码的核心是结合具体场景,通过错误码快速定位问题根源,提高调试效率。