错误传递链断裂需立即修复:检查callback是否为有效函数、确保用预置构造器或正确创建并抛出error对象、验证JS回调接收有效性及JSVM启用错误传播模式。

当你在调用 JSVM-API 的 oh_jsvm_createerror 或 oh_jsvm_throw 等接口后,发现文档回调(callback)未触发、抛出对象丢失、或回调中收到的 error 实例为空/非 Error 类型,说明错误传递链已在某处断裂,必须立即定位并修复。
确认回调函数是否被正确注册
检查你传给 JSVM 接口的 callback 参数是否为真实存在的、可执行的 JavaScript 函数引用,而非字符串、undefined 或 null。
若 callback 是通过 C 层动态构造的字符串再 eval 得到,【这会导致上下文丢失,无法捕获异常】,必须改用 oh_jsvm_createfunctionfromnative 创建原生绑定函数。
验证方式:在 C 代码中插入日志,打印 JSVM_ValueIsFunction(vm, callback) 返回值,确保为 true。
检查错误对象是否被正确创建并传入 throw 接口
方法一:使用预置错误构造器
优先调用 oh_jsvm_throwtypeerror 或 oh_jsvm_throwrangeerror,它们内部自动完成 error 对象创建 + 抛出两步,避免手动创建后忘记抛出。
方法二:手动创建后显式抛出
先调用 oh_jsvm_createtypeerror 获取 error 对象,再立即传给 oh_jsvm_throw;【跳过中间变量缓存或多次赋值,防止 GC 提前回收】。
方法三:复用已有错误信息
若需携带原始错误上下文,用 oh_jsvm_getlasterrorinfo 获取上一次错误详情,再通过 oh_jsvm_createerror 构造新 error 并 throw,不可直接将 info 结构体当 error 对象传入 callback。
验证 JS 层回调能否接收到有效 error 实例
第一步:在 JS 回调函数开头插入防御性判断
if (!(err instanceof Error)) { console.error('Invalid error object received:', err); return; }
第二步:检查 JSVM 是否启用了错误传播模式
确认初始化 JSVM 实例时已启用 JSVM_FLAG_ENABLE_ERROR_PROPAGATION,否则 throw 的 error 不会穿透到 callback 而是静默终止。
第三步:确认回调调用路径未被 try/catch 拦截
如果 C 层在调用 callback 前包裹了 oh_jsvm_trycatch 且未重新 throw,错误将被吞掉;此时应移除该 try/catch,或在其 catch 块末尾显式调用 oh_jsvm_rethrow。

















