25. 错误与崩溃处理
#
错误处理info
在 Yak 中,很多函数来源于 Golang 中的函数;众所周知,Golang 很多函数的最后一个返回值的类型为 error
。
因此在 YakVM 的 Golang 后端中,我们经常的处理错误的方案是
c, err = servicescan.Scan("127.0.0.1", "80,8080-8088")
// 如果有错误,就马上退出当前程序die(err)
当然,除了上述内容,我们还经常这样处理 err,
c, err = servicescan.Scan("127.0.0.1", "80,443")
// 这个分支等价于 die(err)if err != nil { panic(err)}
#
捕获错误:Try 与 Catchyaklang 原生支持 try 和 catch 的模式(>=1.1.7)。在这个模式下,用户可以使用 try 包裹自己的代码,使用 catch 去捕获错误;
try{ println("We are in Trying") die("panic in try!")}catch err { println("Fetch Error" + f": ${err}")}
/*We are in TryingFetch Error: panic in try!*/
当然 try-catch-finally 也被完整的支持了,catch err
的 err 可以随时省略;
try{ println("We are in Trying") die("panic in try!")} catch { println("Fetch Error" + ": Unknown Error")} finally { println("Working in Finally")}
/*We are in TryingFetch Error: Unknown ErrorWorking in Finally*/
#
Golang 模式:Panic 与 Recoveryaklang同样保留了golang的panic/recover机制,其实际上是一个特殊语句,用法与golang保持一致:
func main() { defer fn(){ println("Start RECOVER") assert recover()+1 == 2 println("END RECOVER") }() println("START PANIC") panic(1) println("END PANIC")}
main()/* OUTPUT:START PANICSTART RECOVEREND RECOVER*/
值得注意的是,在yaklang中panic和recover可以在最外层中使用,例如:
defer fn{ err := recover() assert err == "panic test"}
panic("panic test")