鸿蒙 PC Markdown 编辑器错误处理:让失败可恢复而不是只弹提示
鸿蒙 PC Markdown 编辑器错误处理让失败可恢复而不是只弹提示编辑器错误处理的第一目标不是把异常文字显示出来而是保证失败后用户仍有下一步。打开失败不能覆盖当前缓冲区保存失败不能清 dirty选择器取消不是错误正则非法不能破坏正文ArkWeb调用失败要保留原生快照恢复记录损坏不能形成启动崩溃循环。本文基于 OhMarkdown梳理状态栏、对话框、回退值、保存恢复和操作互斥组成的可恢复错误模型。代码位于 https://gitcode.com/VON-/codex_md_oh错误先按后果分级可忽略取消用户关闭文件/保存选择器恢复 Ready或 Modified不显示失败。可重试操作目录读取、搜索、导出、打印失败保留当前状态并给状态栏信息。需要决策冲突外部文件变化、Mixed换行、未保存关闭、保存中断使用明确对话框和按钮。数据安全故障短写、旧版本恢复失败、恢复快照写入失败保留缓冲区或备份并标记 P0/P1。按后果分类比把所有 catch弹对话框更适合高频桌面工具。operationStatus 是非阻断反馈页面持有StateprivateoperationStatus:stringReady;StateprivateoperationInProgressfalse;状态栏始终显示 operationStatus并省略超长文本。常见状态包括 Ready、Opened、Modified、Saving、Saved、Loading folder和具体失败。状态文案不能成为业务事实来源。关闭判断读取 dirty保存完成读取 revision不能因为字符串等于 Saved就删除会话。状态栏是输出不是状态机。选择器取消不是异常constopenedDocumentawaitpickMarkdownDocument(context);if(!openedDocument){this.operationStatusthis.hasUnsavedChanges()?Modified:Ready;return;}用户取消是正常分支。保留当前标签、焦点和 dirty不显示红色失败。保存 URI为空和格式对话框取消也使用同样语义。如果保存并关闭来自外层意图finally检查 dirty仍为 true因此不关闭。取消会正确向外传播为“事务未提交”。打开失败不应用半状态this.operationInProgresstrue;this.operationStatusOpening...;try{awaitthis.applyOpenedDocument(awaitreadUtf8Document(documentUri));}catch(error){this.operationStatusOpen failed:${errorinstanceofError?error.message:String(error)};}finally{this.operationInProgressfalse;}读取完整成功后才 apply。文件过大、非法 UTF-8、短读或权限错误都停在旧会话。不要先清编辑器显示 Loading再读否则失败时用户看到空白且误以为内容丢失。页面可以显示进行中状态但正文保持可见。操作互斥阻止失败窗口内切换目标。保存失败保持 dirty保存函数只有完整写入、truncate、fsync且 revision未变化时设置documentDirtyfalse。catch不调用 markSaved也不清恢复草稿。}catch(error){constfailureMessageerrorinstanceofError?error.message:String(error);this.operationStatusSave failed:${failureMessage};}若已创建 pending备份catch先尝试恢复外部旧文件成功显示 previous file restored失败显示 backup retained。无论哪种当前新正文仍在标签中。错误信息告诉用户磁盘结果但不能泄露完整敏感 URI。未来可把底层错误映射为“权限已撤销”“空间不足”“文件被修改”等可操作类别。外部修改是冲突不是普通失败保存前重新读取磁盘与 persisted正文和格式比较。不一致抛出The file changed on disk. Reopen it or use Save As to avoid overwriting external changes.此时不能自动重试因为重试只会重复冲突用户需要 Reopen、Compare或 Save As。当前通过状态栏提示后续应提供操作按钮。冲突处理不应默认“最后写入者获胜”。对话框失败选择保留脏标签关闭对话框 Promise失败.catch((){this.operationStatusUnable to show confirmation;});标签不关闭。Mixed格式对话框失败向上抛保存catch处理dirty保留。只要无法取得明确用户决策就选择不破坏数据。对话框按钮索引之外的返回也视为取消或保留记录不猜用户意图。恢复记录损坏不能阻断启动try{constrecordJSON.parse(awaitfileIo.readText(path,{encoding:utf-8}))asRecoveryRecord;returnisRecoveryRecordValid(record)?record:undefined;}catch(_){returnundefined;}空、过大、非法 JSON和字段错误返回 undefined。应用继续打开。可在非敏感日志记录“恢复记录无效”但不能因为辅助文件损坏形成每次启动崩溃。有效记录显示 Recover/Discard对话框异常时 catch把状态设为 Recovery unavailable记录仍在下一次可重试。恢复队列失败保留最新记录}catch(error){if(this.pendingRecoveryRecordundefined){this.pendingRecoveryRecordrecord;}throwerror;}写入失败时若没有更晚快照把当前记录放回 pending若已有更新版本不用旧记录覆盖。外层状态显示 Recovery failed。不会无限忙重试下一次编辑快照再触发。恢复失败不能阻止用户继续编辑但属于质量红线应在内部试用记录。ArkWeb失败使用旧正文letcontentthis.documentContent;if(this.editorReady){try{constresultawaitthis.editorController.runJavaScript(window.OhMarkdownEditor?.getDocument() ?? );contentthis.decodeJavaScriptString(result);}catch(_){}}捕获失败保留原生最近快照不写空。runEditorScript失败将 editorReadyfalse页面再次 ready后重放文档、模式、主题和同步设置。这种回退可能不是最后一个按键版本所以恢复快照和保存命令仍应尽量在 Web可用时完成。降级路径的目标是“不扩大损失”不是假装没有错误。搜索与正则错误Web收集匹配用 try/catch非法正则返回空数组原生显示 No matches或 Replace failed。当前无法区分语法错误与零匹配是体验边界但正文不会变化。Replace All先收集完整 changes再一次 dispatch。异常发生在 dispatch前不会部分替换单 transaction还可一次撤销。未来应返回结构化错误和表达式位置。导出与打印失败HTML导出先选择 URI再请求 Web字符串、解码、检查非空后写入。任何错误状态为 HTML export failed当前 Markdown会话不变。打印先要求preparePrint() true大文档直接拒绝不创建不完整适配器。导出目标可能已经创建空文件后失败后续应考虑删除或标记不能为了清理目标影响源文档。操作互斥避免竞态错误文件、目录、导出和打印入口检查operationInProgress。finally始终释放。没有 finally会让一次异常永久禁用工作台提前释放又可能让异步返回写错活动会话。当前是全局互斥简单可靠。后续并行后台保存需要显式 OperationContext而不是删除锁。错误后的 UI 要可继续操作按钮 enabled绑定 operationInProgress和 largeDocumentMode。操作结束即恢复状态栏错误不覆盖正文侧边栏仍可切换脏标签仍能另存或复制。阻断对话框只用于需要用户决策的安全边界。下图为真实文档打开后的应用界面。状态栏承担操作结果正文和文件树保持可用。错误截图应使用专用测试文件避免暴露用户路径。行为报告记录失败前后正文哈希和 dirty而不是只截错误文字。错误信息与本地化当前部分状态为英文硬编码资源化尚未完全。做大前应建立错误码到本地化文案和操作的映射底层 Error保留诊断UI显示中文可执行建议。不要把原始系统堆栈直接给用户也不要完全吞掉。开发日志记录错误类别、API和耗时生产 UI显示安全文案。P0 红线覆盖或丢失用户文件、恢复失败且无备份、保存状态错误清 dirty、跨标签写错正文都为 P0应停止扩展。普通搜索失败、预览样式和目录截断可按 P1/P2处理。内部试用每日记录崩溃、数据丢失和 P0/P1不收正文。错误分类必须进入退出评审。当前边界错误仍以字符串为主没有结构化码非法正则与零匹配不区分冲突缺 Compare/Save As快捷动作导出失败目标清理未完善恢复写失败没有指数退避部分文案未本地化。结语可恢复错误处理的判断标准是失败后数据和下一步。OhMarkdown把取消当正常分支读取成功后才应用保存成功后才清 dirty冲突不覆盖记录损坏不阻断启动Bridge失败保留旧正文所有异步用 finally释放互斥。鸿蒙 PC编辑器不可能消除所有故障但可以保证故障不会自动变成数据丢失也不会把用户困在只能重启的界面。

相关新闻

家庭服务器从入门到精通 · 第 6 篇 · NPM代理到家庭首页导航中心全自动化智能化实现

家庭服务器从入门到精通 · 第 6 篇 · NPM代理到家庭首页导航中心全自动化智能化实现

家庭服务器从入门到精通 第 6 篇 NPM代理到家庭首页导航中心全自动化智能化实现本文是「家庭服务器从入门到精通」系列文章,记录了从零搭建家庭服务器的完整过程。系列:家庭服务器从入门到精通 第 6 篇 作者:妍杰丽云 标签: NPM…

2026/7/22 16:37:42 阅读更多 →
C语言字符型数据类型详解:从ASCII到实际应用

C语言字符型数据类型详解:从ASCII到实际应用

1. 字符型数据类型概述字符型数据类型是C语言中一个非常特殊且重要的数据类型。说它特殊,是因为它既可以表示字符,也可以当作最小的整数类型来使用。说它重要,是因为所有的文本处理、字符串操作、以及很多底层的数据处理都依赖于字符型。在C语…

2026/7/21 19:19:41 阅读更多 →
BlockLauncher:Android版Minecraft终极启动器与Mod平台完全指南

BlockLauncher:Android版Minecraft终极启动器与Mod平台完全指南

BlockLauncher:Android版Minecraft终极启动器与Mod平台完全指南 【免费下载链接】MCPELauncher Source code for BlockLauncher, a launcher that patches Minecraft for Android 项目地址: https://gitcode.com/gh_mirrors/mc/MCPELauncher BlockLauncher是…

2026/7/21 19:19:41 阅读更多 →

最新新闻

提示词工程:提升AI对话质量的关键技术

提示词工程:提升AI对话质量的关键技术

1. 从"随便写点"到精准对话:提示词工程的人机协作密码上周帮朋友调试AI写作工具时,他对着对话框连发三条"写篇科技文章",得到的却是从半导体到航天技术的混乱内容。这个场景让我想起三年前刚接触AI写作时,自己…

2026/7/24 16:08:44 阅读更多 →
开源大模型实战:从性能评估到生产部署的工程化指南

开源大模型实战:从性能评估到生产部署的工程化指南

那天下午,团队里一位刚接触大模型的新同事跑来问我:“现在开源模型这么多,Kimi K3、Qwen 3.8 这些新发布的模型,真的能接近 Anthropic Fable 5 的水平吗?还是只是参数上的数字游戏?” 这个问题很典型&#…

2026/7/24 16:08:44 阅读更多 →
【2026最新】AI新物种FDE(前沿部署工程师)落地实战与面试指南

【2026最新】AI新物种FDE(前沿部署工程师)落地实战与面试指南

引言:AI时代的新兴关键角色 在AI技术浪潮席卷全球的2026年,一个全新的技术岗位正从幕后走向台前,成为连接AI研究与产业应用的关键桥梁——前沿部署工程师(Frontier Deployment Engineer,简称FDE)。他们不仅…

2026/7/24 16:08:44 阅读更多 →
京东抢购自动化脚本:3分钟配置实现高成功率秒杀

京东抢购自动化脚本:3分钟配置实现高成功率秒杀

京东抢购自动化脚本:3分钟配置实现高成功率秒杀 【免费下载链接】JDspyder 京东预约&抢购脚本,可以自定义商品链接 项目地址: https://gitcode.com/gh_mirrors/jd/JDspyder 在当今电商抢购热潮中,手动操作往往难以应对毫秒级的竞争…

2026/7/24 16:08:44 阅读更多 →
大模型成本为什么高?算力、数据、人力三大维度深度拆解

大模型成本为什么高?算力、数据、人力三大维度深度拆解

引言:大模型成本的冰山一角 近年来,以GPT、Llama、Gemini等为代表的大语言模型(LLM)在人工智能领域掀起了一场革命。然而,在这场技术盛宴的背后,是令人咋舌的研发和运营成本。OpenAI CEO Sam Altman曾公开…

2026/7/24 16:08:44 阅读更多 →
百度网盘高速下载终极指南:免费获取真实下载链接的3个步骤

百度网盘高速下载终极指南:免费获取真实下载链接的3个步骤

百度网盘高速下载终极指南:免费获取真实下载链接的3个步骤 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘蜗牛般的下载速度而烦恼吗?百…

2026/7/24 16:07:44 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻