更新异常处理机制,不抛出异常,应当判断返回值然后用 getLastError() 来获得错误信息

This commit is contained in:
Star 2025-12-12 21:16:54 +08:00
parent 7845a0d3dd
commit db25764e8e
2 changed files with 18 additions and 5 deletions

View File

@ -1,7 +1,6 @@
package gojs
import (
"errors"
"fmt"
"reflect"
"runtime"
@ -104,6 +103,7 @@ func go2js(in any, n int, vm *goja.Runtime) any {
// 将go的函数转换为js的函数
t := v.Type()
return func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
vm.SetData("_lastError", nil)
needArgs := make([]reflect.Type, 0)
realArgs := make([]reflect.Value, t.NumIn())
needArgsIndex := map[int]int{}
@ -315,25 +315,35 @@ func go2js(in any, n int, vm *goja.Runtime) any {
for _, outValue := range outValues {
outType := outValue.Type()
if outType.String() == "error" {
var retErr error
if !outValue.IsNil() {
// 抛出异常
if err, ok := outValue.Interface().(*common.GoErr); ok && err != nil {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
retErr = err
} else if err, ok := outValue.Interface().(error); ok && err != nil {
if err1, ok1 := err.(*common.GoErr); ok1 {
if err1 != nil {
panic(vm.NewGoError(err1))
// panic(vm.NewGoError(err1))
retErr = err1
}
} else {
panic(vm.NewGoError(err))
// panic(vm.NewGoError(err))
retErr = err
}
} else {
errStr := u.String(outValue.Interface())
if errStr != "" {
panic(vm.NewGoError(errors.New(errStr)))
// panic(vm.NewGoError(errors.New(errStr)))
retErr = err
}
}
}
if retErr != nil {
GetLogger(vm).Error(retErr.Error())
vm.SetData("_lastError", retErr)
}
// 忽略error参数
continue
}

View File

@ -560,6 +560,9 @@ func New() *Runtime {
}
vm.Set("__startExec", os.Args[0])
vm.SetData("logger", log.New(u.ShortUniqueId()))
vm.Set("getLastError", func(call goja.FunctionCall) goja.Value {
return rt.vm.ToValue(rt.vm.GetData("_lastError"))
})
// 处理模块引用
// TODO 调试gojarequire.NewRegistryWithLoader 引用到第三层就不在执行了,是有什么限制吗?代码会卡住没有反应也不结束。