文章目录
- 背景
- 方法总览
- errno 是什么?
- 基本用法
- 常见 errno 错误码速查
- 实际开发中怎么用?
- 与 HarmonyOS 自定义错误码的区别
- 完整示例代码
- 写在最后
背景
近期发现一款很有意思的HarmonyOS 三方库, 地址 @pura/harmony-utils(V1.4.0) , 作者是"桃花镇童长老", 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦
案例demo导航展示
↓↓↓↓↓↓接下来言归正传 ↓↓↓↓
调试 HarmonyOS 应用的时候,有没有遇到过这种情况:系统 API 抛出一个数字错误码,比如2、13、22,完全不知道什么意思?
StrUtil.getErrnoToString()就是用来解决这个问题的。传入错误码,它直接告诉你这个错误是什么。
方法总览
errno 是什么?
errno是 POSIX 标准里定义的错误码系统,源自 C 语言,Unix/Linux 系统广泛使用。HarmonyOS 底层是基于 Linux 内核的,所以很多系统调用(文件操作、网络操作、权限检查)出错时会返回标准的 errno 错误码。
这些错误码是整数,但人看整数完全不知道代表什么意思。比如:
2=ENOENT:No such file or directory(文件或目录不存在)13=EACCES:Permission denied(没有权限)22=EINVAL:Invalid argument(参数无效)
记这些数字当然没人记得住,所以需要getErrnoToString来转换。
基本用法
this.Btn('getErrnoToString(2) → ENOENT','#641E16',()=>{consts=StrUtil.getErrnoToString(2);this.addLog(`getErrnoToString(2) → "${s}"`);})this.Btn('getErrnoToString(13) → EACCES','#641E16',()=>{consts=StrUtil.getErrnoToString(13);this.addLog(`getErrnoToString(13) → "${s}"`);})实际运行结果:
getErrnoToString(2)→"No such file or directory"或"ENOENT"getErrnoToString(13)→"Permission denied"或"EACCES"
常见 errno 错误码速查
开发中最常遇到的错误码:
| errno | 常量名 | 含义 | 典型触发场景 |
|---|---|---|---|
| 1 | EPERM | Operation not permitted | 操作不被允许 |
| 2 | ENOENT | No such file or directory | 读取不存在的文件 |
| 13 | EACCES | Permission denied | 没有文件读写权限 |
| 17 | EEXIST | File exists | 创建已存在的文件 |
| 20 | ENOTDIR | Not a directory | 把文件当目录用 |
| 21 | EISDIR | Is a directory | 把目录当文件用 |
| 22 | EINVAL | Invalid argument | 传了非法参数 |
| 28 | ENOSPC | No space left on device | 存储空间不足 |
| 36 | ENAMETOOLONG | File name too long | 文件名太长 |
实际开发中怎么用?
最实用的场景是在catch块里:
import{fileIoasfs}from'@kit.CoreFileKit';try{constfile=fs.openSync('/nonexistent/path/file.txt');}catch(e){// e.code 就是 errnoconsterrMsg=StrUtil.getErrnoToString(e.code);console.error(`文件操作失败 [${e.code}]:${errMsg}`);// 输出:文件操作失败 [2]: No such file or directory}这样日志里就不只是一个数字,而是可读的错误信息,调试时一目了然。
与 HarmonyOS 自定义错误码的区别
HarmonyOS 除了 errno 之外,还有自己的 API 错误码体系(通常是 6 位数,比如201000)。getErrnoToString只适用于 errno 这套标准错误码,不适用于 HarmonyOS 的业务错误码。
如果你拿到的是 HarmonyOS 的 6 位业务错误码,需要去查对应模块的官方文档,getErrnoToString查不到。
完整示例代码
把getErrnoToString集成到错误处理流程里的完整示例:
import{StrUtil}from'../Utils/StrUtil';functionhandleFileError(code:number){consterrMsg=StrUtil.getErrnoToString(code);if(code===2){console.warn(`文件不存在:${errMsg}`);// 处理文件不存在的逻辑}elseif(code===13){console.error(`权限不足:${errMsg}`);// 引导用户授权}else{console.error(`未知错误 [${code}]:${errMsg}`);}}写在最后
getErrnoToString是个小工具,但在调试文件操作、系统调用问题时真的能省不少时间。把它加到你的错误处理工具箱里,遇到奇怪的错误码直接查,不用再去搜索"errno 2 是什么意思"。