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

跨语言异常不再难排查:仓颉与 JavaScript 双向异常传播机制完整解析

发布时间:2026/9/24 14:12:39 来源:云帆数科 栏目:资讯中心
跨语言异常不再难排查:仓颉与 JavaScript 双向异常传播机制完整解析
跨语言异常不再难排查仓颉与 JavaScript 双向异常传播机制完整解析【免费下载链接】cangjie_js_interop项目地址: https://gitcode.com/Cangjie/cangjie_js_interopCangjie/cangjie_js_interop仓颉与 JavaScript 互操作库提供了跨语言异常传播机制JavaScript 侧未捕获的错误会自动转换为仓颉异常抛回仓颉侧仓颉侧未捕获的异常也会转换为 JavaScript 异常传入 JS 运行时。这篇文章带你完整看懂这套双向异常传播原理、源码实现与排查技巧让跨语言报错从此有迹可循。为什么跨语言异常排查这么难单语言应用中异常从抛出到捕获都在同一个运行时里完成栈信息完整、消息格式统一。而仓颉调用 JavaScript 的场景下调用链横跨了两个运行时仓颉 → JavaScriptevaluate执行 JS 代码时如果 JS 报错如调用了不存在的函数错误发生在 JS 虚拟机内部仓颉代码却需要一个自己认识的异常对象来catch。JavaScript → 仓颉JS 代码回调仓颉函数时仓颉函数内部抛出的Exception/Error如何被 JS 侧感知互操作库对这两个方向都做了自动处理你不需要手写任何翻译代码。异常传播机制全景两条路径、自动转换互操作库的核心接口是JSRuntimeJS 运行时与JSContext执行上下文异常传播就围绕它们展开。官方用户手册中对两个方向的定义非常明确可参见 js_interop_user_manual.md仓颉调用 JavaScript 时JS 异常未捕获会转换为仓颉异常抛出JavaScript 回调仓颉时仓颉异常未捕获会转换为 JS 异常抛出。整体架构如图README.md 中的 System Architecture 章节路径一JS 异常 → 仓颉异常正向传播当你在仓颉侧调用evaluate执行 JS 代码或调用已注册的 JS 函数时若 JS 侧发生报错互操作库会在每次 C 接口调用后检查 JS 运行时的异常状态。核心逻辑在 runtime.cj 的checkAndHandleError函数中先通过OH_JSVM_IsExceptionPending判断 JS 虚拟机是否有挂起的异常若有用OH_JSVM_GetAndClearLastException取出异常对象并读取它的stack属性最终throw Exception(...)把 JS 异常消息含 JS 堆栈文本包装成仓颉Exception抛出。也就是说你熟悉的 JS 报错信息例如console.log1 is not defined会原样出现在仓颉异常的 message 里直接可用try/catch捕获context.newScope { try { context.evaluate(console.log1(hello, world!)) // log1 不存在JS 报错 } catch (e: Exception) { Hilog.error(0, js_error, e.toString()) // 捕获到的是仓颉异常 } }这两个底层 C 接口的声明位于 napi_cffi.cj如果你需要深入调试可以从这里入手。路径二仓颉异常 → JS 异常反向传播反方向更精妙JS 代码回调仓颉函数时仓颉函数内部抛出的异常如何越过语言边界答案在 function.cj 的回调桩函数jsFunctionCallbackStub中——它捕获仓颉函数抛出的Exception和Error然后调用 throwExceptionToJS把仓颉异常的堆栈逐帧转换成类 JS 的at 类名.方法名(文件:行号)格式文本拼接成Cangjie ${异常信息}\n${堆栈}的消息通过OH_JSVM_ThrowError抛入 JS 运行时。注意一个容易困惑的细节仓颉异常会折返。JS 回调桩抛出 JS 异常后控制权回到仓颉侧的evaluate此时 JS 侧存在挂起异常于是路径一的检查逻辑再次生效——该异常最终又以一个仓颉Exception的形式抛给仓颉调用者。用户手册中的示例正是如此// 仓颉异常传播到 JS 再传播到仓颉抛出参数类型错误 Hilog.info(0, add, 1 2 context.evaluate(add(1, 2)).toInt64().toString())add(1, 2)中第二个参数是字符串仓颉侧toInt64转换失败抛出异常 → 转换为 JS 异常 → 传播回仓颉侧调用者拿到的仍是一个可catch的仓颉异常。异常排查清单3 步定位跨语言报错结合上述机制跨语言异常排查可以固化为三步看异常消息前缀message 以Cangjie开头说明源头是仓颉函数内部没有前缀、带有at xxx (eval:1:xx)风格的堆栈则源头是 JS 代码。看堆栈行号仓颉侧堆栈携带真实的.cj文件与行号可直接跳转源码JS 侧堆栈则指向evaluate传入的代码位置。检查调用方向正向传播仓颉调 JS的异常在evaluate/globalCall处抛出用try/catch包住即可反向传播JS 回调仓颉的异常同样在evaluate返回前抛出但要先确认是参数类型转换失败还是仓颉业务逻辑出错。下面是完整的调用示例工程结构异常捕获应放在newScope作用域内的调用点常见报错速查表报错特征异常源头对应机制xxx is not defined/ 函数未定义JS 代码JS 异常 → 仓颉异常Cangjie Invalid index: ...仓颉互操作库自身参数校验如 array.cjContext has been destroyed!仓颉侧context.cj 上下文生命周期错误Should be run in the libuv thread.仓颉侧未切换到 JS 线程执行见 context.cj其中应在 JS 线程执行的报错值得单独提醒仓颉默认不绑定系统线程而互操作逻辑必须运行在 JS 运行时所在线程上互操作库通过 libuv 任务队列切换线程uv.cj。所有互操作 API 都应放在newScope内调用即可自动满足这一约束。相关资源用户手册含类型映射、执行 JS 代码、JS 回调仓颉章节js_interop_user_manual.md完整 API 参考js_interop_api_docs.md互操作库源码目录src/构建配置cjpm.toml掌握JS 异常转仓颉异常、仓颉异常绕道 JS 再折返这两条传播路径后跨语言报错的排查路径就清晰了异常消息保留原始信息堆栈保留原始行号try/catch在仓颉侧即可统一拦截。✅【免费下载链接】cangjie_js_interop项目地址: https://gitcode.com/Cangjie/cangjie_js_interop创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

swagger-codegen 特殊字符命名处理深入解析:以 jersey2-java8 的 SpecialModelName 模型为例
swagger-codegen 特殊字符命名处理深入解析:以 jersey2-java8 的 SpecialModelName 模型为例

开发工具代码生成API设计 【免费下载链接】swagger-codegen swagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition. 项目地址: http… · 2026/9/24 14:12:39

Comp AI CRM 前端性能实践:用模块级 Map 缓存重复函数调用(js-cache-function-results 规则详解)
Comp AI CRM 前端性能实践:用模块级 Map 缓存重复函数调用(js-cache-function-results 规则详解)

后端前端CRM人工智能AI Agent 【免费下载链接】crm Comp AI CRM is an open source, CRM designed for AI agents. Agentic-first CRM. 项目地址: https://gitcode.com/gh_mirrors/crm48/crm 点击查看 免费下载 本篇文章讲解 Comp AI CRM 仓库内置的 Vercel React … · 2026/9/24 14:12:33

学术论文翻译排版一体化技术解析:解决期刊投稿格式适配核心难题
学术论文翻译排版一体化技术解析:解决期刊投稿格式适配核心难题

一、论文翻译前后排版深度痛点分析 我们团队在实践中发现,科研人员完成外文论文翻译后普遍面临双重格式损耗问题。第一类为文本层错乱,专业公式、上下标、文献引用标注经机器转译后出现字符错位,人工修正单篇平均耗时42分钟,「用… · 2026/9/24 14:12:21

PaddleSpeech 流式 TTS 在线引擎(Python 动态图后端)源码级解析与实战指南
PaddleSpeech 流式 TTS 在线引擎(Python 动态图后端)源码级解析与实战指南

人工智能语音音频 【免费下载链接】PaddleSpeech Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword… · 2026/9/24 14:47:11

Sonnet 2 开发指南:基于 TensorFlow 2 的模块化神经网络库核心用法与序列化实战
Sonnet 2 开发指南:基于 TensorFlow 2 的模块化神经网络库核心用法与序列化实战

深度学习机器学习 【免费下载链接】sonnet TensorFlow-based neural network library 项目地址: https://gitcode.com/gh_mirrors/so/sonnet 点击查看 免费下载 Sonnet 是 DeepMind 设计并构建、运行在 TensorFlow 2 之上的神经网络库,其核心目标是提供… · 2026/9/24 14:47:04

easing-functions-cj API 参考大全:Skill 枚举、getMethod() 与 calculate() 每个参数逐条精讲
easing-functions-cj API 参考大全:Skill 枚举、getMethod() 与 calculate() 每个参数逐条精讲

easing-functions-cj API 参考大全:Skill 枚举、getMethod() 与 calculate() 每个参数逐条精讲 【免费下载链接】easing-functions-cj 一个基于缓动函数的动画UI组件库 项目地址: https://gitcode.com/Cangjie-TPC/easing-functions-cj easing-functions-cj … · 2026/9/24 14:47:04

PDF 补丁丁:免费编辑 PDF 书签、合并文档与解除限制的完整指南
PDF 补丁丁:免费编辑 PDF 书签、合并文档与解除限制的完整指南

PDF 补丁丁:免费编辑 PDF 书签、合并文档与解除限制的完整指南 【免费下载链接】PDFPatcher PDF补丁丁——PDF工具箱,可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档,探查文档结构,提取图片、转成图片等等 项目地址: ht… · 2026/9/24 14:47:04

EasyWeChat 3.x 用户分组(User Group)管理实战:获取、增删改查与批量移动用户完整 API 指南
EasyWeChat 3.x 用户分组(User Group)管理实战:获取、增删改查与批量移动用户完整 API 指南

后端即时通讯 【免费下载链接】easywechat 📦 一个 PHP 微信 SDK 项目地址: https://gitcode.com/gh_mirrors/ea/easywechat 点击查看 免费下载 导读 用户分组是微信公众号后台用户管理的基础能力之一,用于按自定义维度(如地区、… · 2026/9/24 14:47:04

Koin for Compose 实战指南:Jetpack Compose 与 Compose Multiplatform 依赖注入全解析
Koin for Compose 实战指南:Jetpack Compose 与 Compose Multiplatform 依赖注入全解析

Koin for Compose 实战指南:Jetpack Compose 与 Compose Multiplatform 依赖注入全解析 【免费下载链接】koin Koin - a pragmatic lightweight dependency injection framework for Kotlin & Kotlin Multiplatform 项目地址: https://gitcode.com/gh_mirrors… · 2026/9/24 14:47:01

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

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

企业微信二维码