首页/新闻资讯/正文详情

HarmonyOS 应用开发《掌上英语》第44篇:错误边界与异常处理——ArkTS 的 try-catch 实践

发布时间:2026/11/3 18:04:31 来源:云帆数科 栏目:资讯中心
HarmonyOS 应用开发《掌上英语》第44篇:错误边界与异常处理——ArkTS 的 try-catch 实践
错误边界与异常处理——ArkTS 的 try-catch 实践一、为什么需要显式异常处理ArkTS 是静态类型语言编译期可以捕获大部分类型错误。但运行时错误网络 IO、文件访问、数据解析异常等是编译期无法预见的。在这些场景下不处理异常会导致应用直接崩溃。在本项目中异常处理遵循一个黄金法则所有可能出错的系统调用都要包裹在 try-catch 中。这个法则体现在 PreferenceUtil、AudioPlayer、各个 Manager 以及页面组件中。二、PreferenceUtil 中的异常防御PreferenceUtil 是所有数据持久化的基础设施它的稳定性至关重要privateconstructor(context:Context,fileName:string){try{preferences.removePreferencesFromCacheSync(context,fileName)this.dataPreferencespreferences.getPreferencesSync(context,{name:fileName})Logger.info(PreferenceUtil:${fileName}init:${this.dataPreferences!null})}catch(e){Logger.error(PreferenceUtil error :${JSON.stringify(e)})}}publicput(key:string,value:preferences.ValueType){if(!this.dataPreferences){Logger.info(PreferenceUtil: dataPreferences is null)return;// 防御性返回}try{this.dataPreferences?.putSync(key,value)this.dataPreferences?.flush()}catch(e){Logger.info(PreferenceUtil: put error:${JSON.stringify(e)})}}双重防御设计在方法入口处判断dataPreferences是否为空为空则提前返回避免调用空指针上的方法核心操作包裹 try-catch即使 preferences 操作抛出异常应用也不会崩溃这种设计在get、delete、clear、hasSync、getAllSync等方法中一致贯彻。三、AudioPlayer 中的异常处理音频播放涉及媒体框架调用是另一个高风险的 IO 操作publicstaticgetInstance():AudioPlayer{if(!AudioPlayer.instance){AudioPlayer.instancenewAudioPlayer();AudioPlayer.instance.initPlayer();// initPlayer 内部有 try-catch}returnAudioPlayer.instance;}privateasyncinitPlayer():Promisevoid{try{this.avPlayerawaitmedia.createAVPlayer();this.initPlayerEvents();}catch(e){Logger.error(AudioPlayer,初始化播放器失败:${JSON.stringify(e)});}}每个 public 方法都有独立的 try-catchpublicplay(url:string):void{if(!url||url){Logger.warn(AudioPlayer,音频URL为空);return;// 参数校验防御性返回}try{if(!this.avPlayer){return;// 空指针防御}// ... 播放逻辑}catch(e){Logger.error(AudioPlayer,播放失败:${JSON.stringify(e)});}}这里展示了三重防御参数校验空 URL 直接返回空值判断avPlayer 未初始化则跳过try-catch 兜底所有未知异常被捕获四、Manager 业务层的异常处理4.1 NewWordManagerpublicaddNewWord(topicItem:TopicItemType,wordPackage:string默认词汇包):boolean{try{letwords:NewWordItem[]this.getAllNewWords();// ... 业务逻辑this.saveNewWords(words);returntrue;}catch(e){Logger.error(NewWordManager,添加生词失败:${JSON.stringify(e)});returnfalse;// 失败时返回 false调用方可以感知}}关键设计失败时返回false。调用方可以根据返回值判断操作是否成功从而给予用户反馈。4.2 StatisticsManagerpubliccalculateStatistics(ques:TopicItemType[],duration:number):PracticeStatistics{try{// ... 复杂的计算逻辑returnstatistics;}catch(e){Logger.error(StatisticsManager,计算统计数据失败:${JSON.stringify(e)});returnthis.getEmptyStatistics();// 返回空数据不阻塞流程}}当统计计算失败时返回空统计数据而不是抛异常。这保证了答题流程的连续性——用户就算看不到统计也能继续学习。4.3 LearningPlanManagerpublicgetLearningPlan():LearningPlan{try{letplanPreferenceUtil.getInstance().get(this.LEARNING_PLAN_KEY,undefined)asLearningPlan;if(!plan){planthis.cloneLearningPlan(DEFAULT_LEARNING_PLAN);this.saveLearningPlan(plan);}returnplan;}catch(e){Logger.error(LearningPlanManager,获取学习计划失败:${JSON.stringify(e)});returnthis.cloneLearningPlan(DEFAULT_LEARNING_PLAN);// 降级到默认值}}降级策略当无法从存储中读取计划时直接返回默认计划。用户可能丢失之前的设置但应用不会崩溃可以继续使用。五、页面组件中的异常处理在 AnswerQuestionsPage 中记录学习数据使用了 try-catchrecordStudyData(){try{lettopicItemTypeListthis.toTopicItemTypeList(this.ques);StatisticsManager.getInstance().calculateStatistics(topicItemTypeList,this.practiceDuration);letplanManagerLearningPlanManager.getInstance();letansweredCountthis.ques.filter(itemitem.isAnswer).length;planManager.recordWordStudy(answeredCount);}catch(e){Logger.error(AnswerQuestionsPage,记录学习数据失败:${JSON.stringify(e)});}}这里将所有 Manager 调用合并到一个 try-catch 块中。原因是不管哪个 Manager 出错结果都是学习记录失败且都不应该影响用户跳转到报告页面。六、异常处理模式总结6.1 四种降级策略策略示例适用场景返回空值return []、return null获取列表数据时返回默认值return DEFAULT_LEARNING_PLAN获取配置数据时返回空对象return this.getEmptyStatistics()获取统计摘要时返回 falsereturn false增删改操作时6.2 分层处理原则UI 层 → 可选 try-catch关注用户体验 ↓ Manager 层 → 必须 try-catch使用降级策略 ↓ 基础设施层 → 必须 try-catch确保自身稳定 ↓ 系统 API → 可能抛出 BusinessError基础设施层PreferenceUtil、AudioPlayer捕获所有异常确保自身状态一致Manager 层捕获异常后返回降级值向上层提供稳定接口UI 层可以省略 try-catch如果 Manager 已经处理了或额外包裹以记录页面级日志6.3 异常日志要求所有 catch 块中必须记录日志且使用统一的格式Logger.error(ClassName,方法名失败:${JSON.stringify(e)});这确保了异常的可追溯性。在 Hilog 中ERROR 级别的日志有独立的缓冲区即使 DEBUG 和 INFO 日志被清空ERROR 日志也会保留。七、总结从 PreferenceUtil 到 AnswerQuestionsPage本项目的异常处理构建了一道严密的防线。每一个 try-catch 块都搭配了降级策略确保任一模块的临时故障都不会波及整个应用的正常运行。这体现了防御性编程的思想——不信任外部输入不假定系统 API 永远成功始终保持应用的可用性。

相关推荐

BG3ModManager:高效解决《博德之门3》模组加载冲突的智能管理方案
BG3ModManager:高效解决《博德之门3》模组加载冲突的智能管理方案

BG3ModManager:高效解决《博德之门3》模组加载冲突的智能管理方案 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. This is the only official source! 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager 在《博德之门3》的丰富… · 2026/11/3 18:02:31

如何快速掌握ES-Client:面向新手的终极Elasticsearch管理工具指南
如何快速掌握ES-Client:面向新手的终极Elasticsearch管理工具指南

如何快速掌握ES-Client:面向新手的终极Elasticsearch管理工具指南 【免费下载链接】es-client elasticsearch客户端,issue请前往码云:https://gitee.com/qiaoshengda/es-client 项目地址: https://gitcode.com/gh_mirrors/es/es-client … · 2026/9/20 11:50:34

YOLOv8在多场景视觉检测中的工程实践与优化
YOLOv8在多场景视觉检测中的工程实践与优化

1. 项目概述:多场景视觉检测的工程化实践去年参与某智慧园区建设项目时,我们团队需要同时解决工程车辆监管、山火预警和输电线路防护三个看似独立的视觉检测需求。传统方案往往需要部署三套独立系统,而基于YOLOv8的统一检测框架让我们用单个模… · 2026/11/2 0:45:21

C++中struct与class的本质区别与工程实践
C++中struct与class的本质区别与工程实践

1. 结构体与类的本质探析在C的语法体系中,struct和class就像一对孪生兄弟,表面相似却各有性格。作为从C语言继承而来的语法结构,struct在C中被赋予了全新的内涵。记得我刚接触C时,曾天真地认为struct只是C语言中那个简单的数据打包… · 2026/11/3 18:03:32

内网私有化部署DeepSeek:打造能严苛验证算法的智能音箱
内网私有化部署DeepSeek:打造能严苛验证算法的智能音箱

去年年底我把家里的智能音箱从厂商云端切换到了内网私有化部署的 DeepSeek 上。不是简单换一个问答后台,而是做了一个能进行“严苛算法求证”的语音枢纽:语音识别、大模型推理、语音合成全部跑在家庭内网,断外网也能正常工作,数据… · 2026/11/3 18:03:32

2026 AI专业生存指南:Python与大模型应用开发全栈工具清单
2026 AI专业生存指南:Python与大模型应用开发全栈工具清单

2026年了,如果你正准备进入AI专业,或者已经在读大一大二,应该已经感觉到了:学校里教的东西和行业里真正用的东西,中间隔着的不是一两年,而是整整一个技术周期。我这个标题里列了Python和大模型应用&#xf… · 2026/11/3 18:03:32

深度学习在服装推荐系统中的应用与实践
深度学习在服装推荐系统中的应用与实践

1. 项目背景与核心价值服装推荐系统是近年来电商平台和时尚科技领域的热门研究方向。传统基于规则的推荐方式往往存在个性化程度低、更新滞后等问题。这个毕业设计项目通过引入深度学习技术,构建了一套能够自动学习用户偏好与服装特征的智能推荐系统。我在实际开发中… · 2026/11/3 18:03:32

拟贝叶斯方法与STFT结合的非平稳信号处理技术
拟贝叶斯方法与STFT结合的非平稳信号处理技术

1. 拟贝叶斯方法与STFT结合的背景与价值在信号处理领域,非平稳信号的分析一直是个棘手的问题。这类信号的特点是统计特性随时间变化,传统的傅里叶变换难以捕捉其瞬时特征。我在处理生物医学信号时就深有体会——心电图、脑电图这些信号往往包含多个随时间… · 2026/11/3 18:03:32

C语言数据结构选择与查找算法优化实践
C语言数据结构选择与查找算法优化实践

1. 题目背景与需求解析这道PTA(程序设计能力考试)题目考察的是C语言基础编程能力,属于典型的"信息查询"类问题。题目要求我们根据输入的考生信息,在给定准考证号时快速输出对应的考试座位号。在实际考试系统中&#xff… · 2026/11/3 18:02:31

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码