梅竹生辉
梅竹生辉
  • 发布:2026-06-11 14:24
  • 更新:2026-06-11 14:26
  • 阅读:49

UTs插件中reject返回的UniError类型错误,catch到的error永远是string类型,并且汉字变成Unicode 编码

分类:uts

如下面代码所示,uts使用reject返回异常使用UniError,在调用的时候,变成了string类型,并且汉字变成了Unicode编码,变成了:\U6062\U590d\U8d2d\U4e70\U5931\U8d25

@UTSJS.keepAlive  
export function restorePurchases() : Promise<TransactionsResult> {  
  return new Promise<TransactionsResult>((resolve, reject) => {  
    native().restorePurchases((json : string) => {  
      const res : TransactionsResult = { transactions: txListFromJson(json) }  
      resolve(res)  
    }, (msg : string) => {  
      // reject(new StoreKitFailImpl(9020009, msg))  
      reject(new UniError("dh-storekit", 9020009, "恢复购买失败"))  
    })  
  })  
}

在vue文件里面调用的时候,变成了下面的字符串,我使用typeof err == 'string',并且errMsg变成了Unicode编码

 {  
 errCode = 9020009;  
 errMsg = "\U6062\U590d\U8d2d\U4e70\U5931\U8d25";  
 errSubject = "dh-storekit";  
 }  
2026-06-11 14:24 负责人:无 分享
已邀请:
Ask小助手

Ask小助手

欢迎到专业群( uni-app x技术交流群 ) 咨询,群中有相关专业的管理员和群友。

这个问题是 uni-app x 在 iOS 平台上处理 Promise reject 时的一个已知行为差异。

在 uts 插件中使用 reject(new UniError("dh-storekit", 9020009, "恢复购买失败")) 返回错误对象,但在 vue 页面中通过 catch 捕获时,iOS 平台会将 UniError 对象转换为字符串,并且中文字符会被编码为 Unicode 转义序列(如 \u6062\u590d\u8d2d\u4e70\u5931\u8d25)。

根据知识库中 ISSUE 系统的信息,Promise.reject 在 uni-app x 中存在类型推导和跨平台行为差异的问题。参考 Promise.reject 引发的类型推导编译报错 这个已确认的问题,临时解决方案是指定 Promise 的泛型类型。

针对你遇到的情况,建议采用以下方式处理:

方案一:在 catch 中处理 Unicode 编码

在 vue 页面中接收到字符串类型的错误后,手动解码 Unicode:

restorePurchases().then(res => {  
  // 处理成功  
}).catch((err) => {  
  let errMsg = '';  
  if (typeof err === 'string') {  
    // 解码 Unicode 转义序列  
    errMsg = unescape(err.replace(/\\u/g, '%u'));  
  } else if (err instanceof UniError) {  
    errMsg = err.errMsg;  
  }  
  console.log('错误信息:', errMsg);  
});

本助手使用国产模型,生成代码准确率较低。强烈建议使用uni-agent生成代码

方案二:修改 reject 方式,传递字符串

在 uts 插件中直接 reject 字符串,避免跨平台对象序列化问题:

reject(JSON.stringify({  
  errSubject: "dh-storekit",  
  errCode: 9020009,  
  errMsg: "恢复购买失败"  
}));

本助手使用国产模型,生成代码准确率较低。强烈建议使用uni-agent生成代码

然后在 vue 页面中解析:

.catch((err) => {  
  let errorObj;  
  if (typeof err === 'string') {  
    try {  
      errorObj = JSON.parse(err);  
    } catch(e) {  
      errorObj = { errMsg: err };  
    }  
  }  
  console.log(errorObj.errMsg); // 正常显示中文  
});

本助手使用国产模型,生成代码准确率较低。强烈建议使用uni-agent生成代码

方案三:使用泛型明确 Promise 类型

参考 ISSUE 系统中的建议,在 uvt 文件中明确指定 Promise 的泛型类型:

export function restorePurchases(): Promise<TransactionsResult> {  
  return new Promise<TransactionsResult>((resolve, reject) => {  
    native().restorePurchases((json: string) => {  
      const res: TransactionsResult = { transactions: txListFromJson(json) }  
      resolve(res)  
    }, (msg: string) => {  
      reject(new UniError("dh-storekit", 9020009, "恢复购买失败"))  
    })  
  })  
}

本助手使用国产模型,生成代码准确率较低。强烈建议使用uni-agent生成代码

这个问题在 iOS 平台上表现尤为明显,主要是由于不同平台对 UniError 对象序列化处理方式的差异导致的。建议在跨平台开发时,对错误处理进行统一的兼容性处理。

内容为 AI 生成,仅供参考
梅竹生辉

梅竹生辉 (作者) - 随缘而来乘风而去

主要是有两个问题

1:catch里面err类型错误,应该是object类型,变成了string类型

2:返回的汉字编码错误,变成了Unicode字符

要回复问题请先登录注册