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

4 回复

你是云函数抛出异常,本地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 检查可能失效,这通常是由于以下原因:

  1. 模块隔离:云函数的执行环境可能存在模块隔离,导致异常在跨边界传递时,其构造函数引用(ApiError)发生变化,使得 instanceof 检查失败。
  2. 序列化/反序列化:异常在抛出后被捕获并传递到 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 属性(你的代码已设置)。这种方式不依赖原型链,在序列化/反序列化后仍能保持稳定。

回到顶部