-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrecover.go
149 lines (112 loc) · 2.18 KB
/
recover.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package main
func main() {
test_1()
test_2()
test_3()
test_4()
test_5()
test_6()
}
func test_1() {
println("test_1")
var t = recover()
println(t)
println("Returned normally from test_1.")
}
func test_2() {
println("test_2")
var x, y = f()
println("Returned normally from f.")
println(x, y)
}
func f() (int, bool) {
defer func() {
if r := recover(); r != nil {
println("Recovered in f")
println(r == nil)
}
}()
println("Calling g.")
g(0)
println("Returned normally from g.")
return 9, true
}
func g(i int) bool {
if i > 3 {
println("Panicking!")
panic(i)
}
defer println("Defer in g", i)
println("Printing in g", i)
g(i + 1)
return true
}
func test_3() {
println("test_3")
defer customRecoverFromPanic("recovering from test_3")
defer customRecoverFromPanic("second call to recover from test_3")
customPanic("panicking from test_3")
}
func customPanic(msg string) {
panic(msg)
}
func customRecoverFromPanic(msg string) int {
var x, y = recover(), recover()
println(x == nil)
println(y)
println(msg)
return 9
}
func test_4() {
println("test_4")
a := []int{5, 6}
val, err := checkAndGet(a, 2)
println("Val: ", val)
println("Error: ", err)
val, err = checkAndGet(a, 1)
println("Val: ", val)
println("Error: ", err)
}
func checkAndGet(a []int, index int) (int, bool) {
defer handleOutOfBounds()
if index > (len(a) - 1) {
panic("Out of bound access for slice")
}
return a[index], true
}
func handleOutOfBounds() {
if r := recover(); r != nil {
println("Recovering from panic:", r == nil)
}
}
func test_5() {
println("test_5")
defer handleNilDereference()
defer handleNilDereference()
var f func() int
var x = f()
println("X: ", x)
}
func handleNilDereference() {
if r := recover(); r != nil {
println("Recovering from panic:", r == nil)
} else {
println("No panic")
}
}
func test_6() {
println("test_6")
defer handleNilMapAssignment()
var m map[string]int
defer handleNilMapAssignment()
defer handleNilMapAssignment()
m["a"] = 1
println("Returned normally from test_6.")
}
func handleNilMapAssignment() {
if r := recover(); r != nil {
println("Recovering from panic:", r == nil)
} else {
println("No panic")
}
}