升级异常处理机制

This commit is contained in:
Star 2025-12-12 21:26:26 +08:00
parent 16832cb71a
commit 6bdbcde246
3 changed files with 117 additions and 55 deletions

116
file.go
View File

@ -43,9 +43,12 @@ func init() {
"mkdir": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { "mkdir": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
args := gojs.MakeArgs(&argsIn, vm).Check(1) args := gojs.MakeArgs(&argsIn, vm).Check(1)
if err := os.MkdirAll(args.Path(0), 0755); err != nil { if err := os.MkdirAll(args.Path(0), 0755); err != nil {
panic(vm.NewGoError(err)) // panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return vm.ToValue(false)
} }
return nil return vm.ToValue(true)
}, },
"read": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { "read": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
args := gojs.MakeArgs(&argsIn, vm).Check(1) args := gojs.MakeArgs(&argsIn, vm).Check(1)
@ -53,7 +56,10 @@ func init() {
if r, err := u.ReadFile(filename); err == nil { if r, err := u.ReadFile(filename); err == nil {
return vm.ToValue(r) return vm.ToValue(r)
} else { } else {
panic(vm.NewGoError(err)) // panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return vm.ToValue("")
} }
}, },
"readBytes": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { "readBytes": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
@ -61,30 +67,45 @@ func init() {
if r, err := u.ReadFileBytes(args.Path(0)); err == nil { if r, err := u.ReadFileBytes(args.Path(0)); err == nil {
return vm.ToValue(r) return vm.ToValue(r)
} else { } else {
panic(vm.NewGoError(err)) // panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return vm.ToValue([]byte{})
} }
}, },
"write": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { "write": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
args := gojs.MakeArgs(&argsIn, vm).Check(2) args := gojs.MakeArgs(&argsIn, vm).Check(2)
filename := args.Path(0) filename := args.Path(0)
if err := u.WriteFileBytes(filename, args.Bytes(1)); err == nil { if err := u.WriteFileBytes(filename, args.Bytes(1)); err == nil {
return nil return vm.ToValue(true)
} else { } else {
panic(vm.NewGoError(err)) // panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return vm.ToValue(false)
} }
}, },
"dir": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { "dir": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
args := gojs.MakeArgs(&argsIn, vm).Check(1) args := gojs.MakeArgs(&argsIn, vm).Check(1)
if r, err := u.ReadDir(args.Path(0)); err == nil { if list, err := listFile(args.Path(0), []map[string]any{}, args.Bool(1)); err == nil {
list := make([]map[string]any, len(r))
for i, info := range r {
list[i] = makeFileInfo(&info)
}
return vm.ToValue(list) return vm.ToValue(list)
} else { } else {
panic(vm.NewGoError(err)) // panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return vm.ToValue([]map[string]any{})
} }
}, },
"join": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
args := gojs.MakeArgs(&argsIn, vm).Check(1)
parts := args.StrArray(0)
if os.PathSeparator != '/' {
for i := range parts {
parts[i] = strings.ReplaceAll(parts[i], "/", string(os.PathSeparator))
}
}
return vm.ToValue(filepath.Join(parts...))
},
"stat": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { "stat": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
args := gojs.MakeArgs(&argsIn, vm).Check(1) args := gojs.MakeArgs(&argsIn, vm).Check(1)
return vm.ToValue(makeFileInfo(u.GetFileInfo(args.Path(0)))) return vm.ToValue(makeFileInfo(u.GetFileInfo(args.Path(0))))
@ -96,25 +117,34 @@ func init() {
"remove": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { "remove": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
args := gojs.MakeArgs(&argsIn, vm).Check(1) args := gojs.MakeArgs(&argsIn, vm).Check(1)
if err := os.RemoveAll(args.Path(0)); err == nil { if err := os.RemoveAll(args.Path(0)); err == nil {
return nil return vm.ToValue(true)
} else { } else {
panic(vm.NewGoError(err)) // panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return vm.ToValue(false)
} }
}, },
"rename": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { "rename": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
args := gojs.MakeArgs(&argsIn, vm).Check(2) args := gojs.MakeArgs(&argsIn, vm).Check(2)
if err := os.Rename(args.Path(0), args.Path(1)); err == nil { if err := os.Rename(args.Path(0), args.Path(1)); err == nil {
return nil return vm.ToValue(true)
} else { } else {
panic(vm.NewGoError(err)) // panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return vm.ToValue(false)
} }
}, },
"copy": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { "copy": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
args := gojs.MakeArgs(&argsIn, vm).Check(2) args := gojs.MakeArgs(&argsIn, vm).Check(2)
if err := u.CopyFile(args.Path(0), args.Path(1)); err == nil { if err := u.CopyFile(args.Path(0), args.Path(1)); err == nil {
return nil return vm.ToValue(true)
} else { } else {
panic(vm.NewGoError(err)) // panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return vm.ToValue(false)
} }
}, },
"cache": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { "cache": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
@ -193,11 +223,17 @@ func init() {
} }
if err == nil { if err == nil {
if err = u.WriteFileBytes(gojs.FixPath(vm, filename), data); err != nil { if err = u.WriteFileBytes(gojs.FixPath(vm, filename), data); err != nil {
panic(vm.NewGoError(err)) // panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return vm.ToValue(false)
} }
return nil return vm.ToValue(true)
} else { } else {
panic(vm.NewGoError(err)) // panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
} }
}, },
"load": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value { "load": func(argsIn goja.FunctionCall, vm *goja.Runtime) goja.Value {
@ -213,10 +249,16 @@ func init() {
if err == nil { if err == nil {
return vm.ToValue(r) return vm.ToValue(r)
} else { } else {
panic(vm.NewGoError(err)) // panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
} }
} else { } else {
panic(vm.NewGoError(err)) // panic(vm.NewGoError(err))
vm.SetData("_lastError", err)
gojs.GetLogger(vm).Error(err.Error())
return nil
} }
}, },
} }
@ -232,14 +274,32 @@ func init() {
func makeFileInfo(info *u.FileInfo) map[string]any { func makeFileInfo(info *u.FileInfo) map[string]any {
return map[string]any{ return map[string]any{
"name": info.Name, "name": info.Name,
"size": info.Size, "size": info.Size,
"fullName": info.FullName, "path": info.FullName,
"isDir": info.IsDir, "isDir": info.IsDir,
"modTime": info.ModTime.UnixMilli(), "modTime": info.ModTime.UnixMilli(),
} }
} }
func listFile(rootPath string, list []map[string]any, recursive bool) ([]map[string]any, error) {
var outErr error
if r, err := u.ReadDir(rootPath); err == nil {
for _, info := range r {
list = append(list, makeFileInfo(&info))
if recursive && info.IsDir {
list, err = listFile(info.FullName, list, recursive)
if err != nil {
outErr = err
}
}
}
} else {
outErr = err
}
return list, outErr
}
func searchFile(vm *goja.Runtime, searchPath, name string) string { func searchFile(vm *goja.Runtime, searchPath, name string) string {
searchPath = gojs.FixPath(vm, searchPath) searchPath = gojs.FixPath(vm, searchPath)

48
file.ts
View File

@ -1,22 +1,23 @@
// just for develop // just for develop
export default { export default {
exists, exists,
mkdir, mkdir,
read, read,
readBytes, readBytes,
write, write,
dir, dir,
stat, join,
find, stat,
remove, find,
rename, remove,
copy, rename,
cache, copy,
load, cache,
save, load,
searchFile, save,
loadConfig searchFile,
loadConfig
} }
function exists(filename: string): boolean { return false } function exists(filename: string): boolean { return false }
@ -24,7 +25,8 @@ function mkdir(filename: string): void { }
function read(filename: string): string { return '' } function read(filename: string): string { return '' }
function readBytes(filename: string): any { return null } function readBytes(filename: string): any { return null }
function write(filename: string, data: any): void { } function write(filename: string, data: any): void { }
function dir(filename: string): Array<FileInfo> { return null as any } function dir(filename: string, recursive?: boolean): Array<FileInfo> { return null as any }
function join(...paths: string[]): string { return '' }
function stat(filename: string): FileInfo { return null as any } function stat(filename: string): FileInfo { return null as any }
function find(filename: string): string { return '' } function find(filename: string): string { return '' }
function remove(filename: string): void { } function remove(filename: string): void { }
@ -36,10 +38,10 @@ function save(filename: string, data: any) { }
function searchFile(filename: string, searchPath?: string): string { return '' } function searchFile(filename: string, searchPath?: string): string { return '' }
function loadConfig(name: string): any { return null } function loadConfig(name: string): any { return null }
interface FileInfo { export interface FileInfo {
name: string name: string
fullName: string fullName: string
isDir: boolean isDir: boolean
size: number size: number
modTime: number modTime: number
} }

8
go.mod
View File

@ -3,7 +3,7 @@ module apigo.cc/gojs/file
go 1.24.0 go 1.24.0
require ( require (
apigo.cc/gojs v0.0.30 apigo.cc/gojs v0.0.32
apigo.cc/gojs/console v0.0.4 apigo.cc/gojs/console v0.0.4
github.com/ssgo/u v1.7.23 github.com/ssgo/u v1.7.23
gopkg.in/yaml.v3 v3.0.1 gopkg.in/yaml.v3 v3.0.1
@ -15,9 +15,9 @@ require (
github.com/go-sourcemap/sourcemap v2.1.4+incompatible // indirect github.com/go-sourcemap/sourcemap v2.1.4+incompatible // indirect
github.com/google/pprof v0.0.0-20250903194437-c28834ac2320 // indirect github.com/google/pprof v0.0.0-20250903194437-c28834ac2320 // indirect
github.com/ssgo/config v1.7.10 // indirect github.com/ssgo/config v1.7.10 // indirect
github.com/ssgo/log v1.7.9 // indirect github.com/ssgo/log v1.7.10 // indirect
github.com/ssgo/standard v1.7.7 // indirect github.com/ssgo/standard v1.7.7 // indirect
github.com/ssgo/tool v0.4.29 // indirect github.com/ssgo/tool v0.4.29 // indirect
golang.org/x/sys v0.38.0 // indirect golang.org/x/sys v0.39.0 // indirect
golang.org/x/text v0.31.0 // indirect golang.org/x/text v0.32.0 // indirect
) )