如何在调用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
相关产品推荐
相关产品推荐

