【鸿蒙生态共建】aboutToAppear中代码执行卡死来看async函数中的异常处理的必要性-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化

48 阅读8分钟

作为iOS的研发人员,转向鸿蒙平台,学习ArkTS时,对于在函数前面加async的理解一直是懵懵的。一直是当作可异步执行的函数。

但是,对于调用异步函数时,前面加 await的这种写法,该函数也必须是async就不太理解了。

本篇内容是《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》这本书第四章内容的延续,是咱这本书读者的福利,在本篇内容中通过一个产生异常的async函数,来看一下async函数中处理异常的必要性,欢迎大家一同来深入的了解,甚至可以当作面试题来学习。

对本书感兴趣的同学可以点击以下链接进行购买,及参加 我的班级(华为官方)共同学习

往期福利:

  1. 【页面路由导航】三步实现页面跳转的完整示例-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  2. 【鸿蒙生态共建】一文10个示例讲懂鸿蒙系统ArkTS中的null与undefined的区别与应用-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  3. 【鸿蒙生态共建】一文两表三实例讲清async函数与普通函数的区别-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  4. 【鸿蒙生态共建】一文说清基础类型数据的非预期输入转换与兜底-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  5. 【鸿蒙生态共建】一文说明兼容版本、目标版本和编译版本的区别与应用实践-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  6. 【鸿蒙生态共建】一文说清复杂类型数据的非预期输入转换与兜底-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  7. 【鸿蒙生态共建】鸿蒙6适配-API变化与兼容(1.基础能力篇)-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  8. 【鸿蒙生态共建】一文讲清如何实现对开发版及发布版分别单独配置签名证书-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  9. 【鸿蒙生态共建】鸿蒙6适配-API变化与兼容(2.UI交互与基础能力篇)--《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  10. 【鸿蒙生态共建】鸿蒙6适配-API变更与兼容(3.UI交互能力篇)-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  11. 【鸿蒙生态共建】一文讲清从注册到发布共享库至openharmony三方库中心仓(Module化及复用)-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  12. 【鸿蒙生态共建】一文讲清发布共享库至openharmony三方库中心仓时Module的配置-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  13. 【鸿蒙生态共建】一文讲清如何复用openharmony三方库中心仓中的共享库-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  14. 【鸿蒙生态共建】一文讲清使用Web组件加载网页的三种方法-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  15. 【鸿蒙生态共建】一文讲清窗口(window)的基础用法-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  16. 【鸿蒙生态共建】一文讲清窗口(window)的基础用法(二)-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  17. 【鸿蒙生态共建】一文讲清窗口(window)的基础用法(三)数据状态变更的同步-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利

最近在调试代码时,发现部分代码一直没有执行,最终定位发现在async的函数中,产生了异常,但程序也没有崩溃,代码如下。

1.原代码

// 函数实现
export function sandBoxFileUriToImagePixelMap(sandBoxFileUri: string): PixelMap {
  const file = fileIo.openSync(sandBoxFileUri);
  console.log("get image open file success")
  ...
}

// 调用代码,在ArkUI组件中
async aboutToAppear(): Promise<void> {
  console.log("get image")
  let image = sandBoxFileUriToImagePixelMap(this.fileUri);
  console.log("get image success")
}

代码执行卡死,但不报崩溃。App也可以正常使用。

​2.增加异常捕获的代码

// 函数实现
export function sandBoxFileUriToImagePixelMap(sandBoxFileUri: string): PixelMap {
  const file = fileIo.openSync(sandBoxFileUri);
  console.log("get image open file success")
  ...
}

// 调用代码,在ArkUI组件中
async aboutToAppear(): Promise<void> {
  try {
    console.log("get image")
    let image = sandBoxFileUriToImagePixelMap(this.fileUri);
    console.log("get image success")
  } catch (e) {
    let err = e as BusinessError;
    console.error(`get image Failed. Code:${err.code}, message:${err.message}`);
    return;
  }
}

异常被捕获,报错。

cke_13905.png

3.去掉async和Promise

// 函数实现
export function sandBoxFileUriToImagePixelMap(sandBoxFileUri: string): PixelMap {
  const file = fileIo.openSync(sandBoxFileUri);
  console.log("get image open file success")
  ...
}

// 调用代码,在ArkUI组件中
aboutToAppear() {
  console.log("get image")
  let image = sandBoxFileUriToImagePixelMap(this.fileUri);
  console.log("get image success")
}

程序运行崩溃,明确显示出错位置

cke_30598.png

4.总结

  • aboutToAppear方法,系统在调用时,如为async函数,则会增加异常捕获。如为非async函数,则没有增加。
  • 对于async函数,如果调用方为非自实现,则需要增加try catch,捕获异常,这样有助于在自实现的代码范围内发现问题。

对本书感兴趣的同学可以点击以下链接进行购买,及参加 我的班级(华为官方)共同学习