HarmonyOS鸿蒙Next云函数中代码抛出的自定义异常被catch后,使用instanceof无法匹配上
HarmonyOS鸿蒙Next云函数中代码抛出的自定义异常被catch后,使用instanceof无法匹配上 定义错误
export class ApiError extends Error {
code: number
error: string
constructor(code: number, error: string = "") {
super(`ApiError code:${code}, messag:${error}`)
this.name = "ApiError"
this.error = error
this.code = code
}
toResult(language: string) {
return {
code: this.code,
message: ApiError.message(this.code, language)
}
}
static throw(code: number, message: string = ""): never {
throw new ApiError(code, "业务异常 " + message)
}
}
在业务处调用ApiError.throw抛出一个异常后,在handler入口catch主异常,下面代码e instanceof ApiError始终无法匹配上一直走else分支,什么情况
export class ApiErrorHandler {
static handler(path: string, language: string, env: string, callback, logger, e: Error) {
if (e instanceof ApiError) {
const message = e.toResult(language)
logger.warn(`处理运行错误 path:${path}, code = ${e.code}, message = ${message}, error = ${e.error}`)
callback(e.toResult(language))
} else {
const result = { code: ApiError.Error_Unknown, message: ApiError.message(ApiError.Error_Unknown, language) }
logger.error(`处理未知错误 path:${path}, error = ${e.message}, result:${JSON.stringify(result)}, stack:${e.stack}`)
callback(result)
}
}
}
更多关于HarmonyOS鸿蒙Next云函数中代码抛出的自定义异常被catch后,使用instanceof无法匹配上的实战教程也可以访问 https://www.itying.com/category-93-b0.html
你是云函数抛出异常,本地try catch异常吗?云函数中抛出的错误,与本地的并不是同一个对象,你可以断点看看类型,应该就是一个Error或Object。
更多关于HarmonyOS鸿蒙Next云函数中代码抛出的自定义异常被catch后,使用instanceof无法匹配上的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
元函数抛出的,也是云函数里面catch的。
export async function myHandler(event, context, callback, logger) {
try {
loadUserInfo(event)
} catch (e) {
ApiErrorHandler.handler("null", language, env, callback, logger, e)
}
}
结构就这样,loadUserInfo方法里面会调用ApiError.throw() 抛出一个异常,外面catch住后传入ApiErrorHandler.handler方法里使用instanceof却无法匹配上。云函数本地调试断点能看到错误就是ApiError,很懵逼,
在HarmonyOS Next云函数中,自定义异常被catch后instanceof无法匹配,通常是由于云函数运行时环境与本地环境隔离,导致自定义异常的原型链不一致。云函数中的异常对象可能被序列化后重新构造,丢失了原有的原型链信息。建议在异常处理时使用自定义的type字段进行类型判断,而非依赖instanceof。
在HarmonyOS Next云函数环境中,自定义异常跨模块/函数边界传递时,instanceof 检查可能失效,这通常是由于以下原因:
- 模块隔离:云函数的执行环境可能存在模块隔离,导致异常在跨边界传递时,其构造函数引用(
ApiError)发生变化,使得instanceof检查失败。 - 序列化/反序列化:异常在抛出后被捕获并传递到
handler时,可能经过了序列化和反序列化过程,导致原型链断裂。
解决方案:
使用自定义属性(如 name 字段)进行类型判断,替代 instanceof:
export class ApiErrorHandler {
static handler(path: string, language: string, env: string, callback, logger, e: Error) {
// 使用 name 属性判断异常类型
if (e.name === 'ApiError') {
const apiError = e as ApiError; // 类型断言
const message = apiError.toResult(language);
logger.warn(`处理运行错误 path:${path}, code = ${apiError.code}, message = ${message}, error = ${apiError.error}`);
callback(apiError.toResult(language));
} else {
const result = { code: ApiError.Error_Unknown, message: ApiError.message(ApiError.Error_Unknown, language) };
logger.error(`处理未知错误 path:${path}, error = ${e.message}, result:${JSON.stringify(result)}, stack:${e.stack}`);
callback(result);
}
}
}
同时,确保 ApiError 类在定义时正确设置 name 属性(你的代码已设置)。这种方式不依赖原型链,在序列化/反序列化后仍能保持稳定。

