You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在调用Go语言syscall/js包的JS函数时捕获异常?

捕获Go WASM中JS函数调用的异常

在Go的syscall/js包中,要捕获JS函数调用抛出的异常,核心是使用js.TryCatch函数——它专门用来包裹可能触发JS异常的操作,将JS异常转换为Go的error类型,避免程序直接终止。

基础用法示例

针对你获取localStorage的场景,用js.TryCatch改写代码如下:

package main

import "syscall/js"

func main() {
    var localStorage js.Value
    // 用TryCatch包裹可能抛出异常的JS调用
    err := js.TryCatch(func() {
        localStorage = js.Global().Get("window").Get("localStorage")
    })

    if err != nil {
        // 异常处理:提示用户或更新UI
        js.Global().Get("alert").Invoke("本地存储已禁用,请启用后重试")
        // 这里可以添加更多UI错误处理逻辑,比如修改页面提示元素
        return
    }

    // 无异常时正常使用localStorage
    localStorage.SetItem("demoKey", "demoValue")
}

获取详细异常信息

如果需要获取JS异常的具体内容(比如错误消息),可以将捕获到的error类型断言为*js.Error,进而访问JS原生Error对象的属性:

if err != nil {
    if jsErr, ok := err.(*js.Error); ok {
        errMsg := jsErr.Value.Get("message").String()
        // 打印到浏览器控制台
        js.Global().Get("console").Call("error", "JS异常:", errMsg)
        // 也可以将错误信息展示到页面UI中
        js.Global().Get("document").Get("getElementById").Invoke("errorMsg").Set("textContent", errMsg)
    }
}

关键说明

  • js.TryCatch的参数是一个无返回值的函数,所有可能触发JS异常的操作都要放在这个函数内部执行。
  • 一旦JS抛出异常,TryCatch会立即终止内部函数的执行,并将异常转换为Go的error返回,程序可以继续执行后续逻辑。
  • 这种方式不仅适用于localStorage,任何调用JS API可能抛出异常的场景都可以用同样的方式处理。

内容的提问来源于stack exchange,提问作者Larry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 02:01:57