mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-12 23:13:40 +00:00
compiler: implement recover() built-in function
This commit is contained in:
committed by
Ron Evans
parent
79ba6a50c3
commit
8d6b210c09
Vendored
+99
@@ -0,0 +1,99 @@
|
||||
package main
|
||||
|
||||
func main() {
|
||||
println("# simple recover")
|
||||
recoverSimple()
|
||||
|
||||
println("\n# recover with result")
|
||||
result := recoverWithResult()
|
||||
println("result:", result)
|
||||
|
||||
println("\n# nested defer frame")
|
||||
nestedDefer()
|
||||
|
||||
println("\n# nested panic: panic inside recover")
|
||||
nestedPanic()
|
||||
|
||||
println("\n# panic inside defer")
|
||||
panicInsideDefer()
|
||||
|
||||
println("\n# panic replace")
|
||||
panicReplace()
|
||||
}
|
||||
|
||||
func recoverSimple() {
|
||||
defer func() {
|
||||
println("recovering...")
|
||||
printitf("recovered:", recover())
|
||||
}()
|
||||
println("running panic...")
|
||||
panic("panic")
|
||||
}
|
||||
|
||||
func recoverWithResult() (result int) {
|
||||
defer func() {
|
||||
printitf("recovered:", recover())
|
||||
}()
|
||||
result = 3
|
||||
println("running panic...")
|
||||
panic("panic")
|
||||
}
|
||||
|
||||
func nestedDefer() {
|
||||
defer func() {
|
||||
printitf("recovered:", recover())
|
||||
}()
|
||||
|
||||
func() {
|
||||
// The defer here doesn't catch the panic using recover(), so the outer
|
||||
// panic should do that.
|
||||
defer func() {
|
||||
println("deferred nested function")
|
||||
}()
|
||||
panic("panic")
|
||||
}()
|
||||
println("unreachable")
|
||||
}
|
||||
|
||||
func nestedPanic() {
|
||||
defer func() {
|
||||
printitf("recovered 1:", recover())
|
||||
|
||||
defer func() {
|
||||
printitf("recovered 2:", recover())
|
||||
}()
|
||||
|
||||
panic("foo")
|
||||
}()
|
||||
panic("panic")
|
||||
}
|
||||
|
||||
func panicInsideDefer() {
|
||||
defer func() {
|
||||
printitf("recovered:", recover())
|
||||
}()
|
||||
defer func() {
|
||||
panic("panic")
|
||||
}()
|
||||
}
|
||||
|
||||
func panicReplace() {
|
||||
defer func() {
|
||||
printitf("recovered:", recover())
|
||||
}()
|
||||
defer func() {
|
||||
println("panic 2")
|
||||
panic("panic 2")
|
||||
}()
|
||||
println("panic 1")
|
||||
panic("panic 1")
|
||||
}
|
||||
|
||||
func printitf(msg string, itf interface{}) {
|
||||
switch itf := itf.(type) {
|
||||
case string:
|
||||
println(msg, itf)
|
||||
default:
|
||||
println(msg, itf)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user