github.com/yanyiwu/go@v0.0.0-20150106053140-03d6637dbb7f/test/recover2.go (about) 1 // run 2 3 // Copyright 2010 The Go Authors. All rights reserved. 4 // Use of this source code is governed by a BSD-style 5 // license that can be found in the LICENSE file. 6 7 // Test of recover for run-time errors. 8 9 // TODO(rsc): 10 // null pointer accesses 11 12 package main 13 14 import "strings" 15 16 var x = make([]byte, 10) 17 18 func main() { 19 test1() 20 test2() 21 test3() 22 test4() 23 test5() 24 test6() 25 test7() 26 } 27 28 func mustRecover(s string) { 29 v := recover() 30 if v == nil { 31 panic("expected panic") 32 } 33 if e := v.(error).Error(); strings.Index(e, s) < 0 { 34 panic("want: " + s + "; have: " + e) 35 } 36 } 37 38 func test1() { 39 defer mustRecover("index") 40 println(x[123]) 41 } 42 43 func test2() { 44 defer mustRecover("slice") 45 println(x[5:15]) 46 } 47 48 func test3() { 49 defer mustRecover("slice") 50 var lo = 11 51 var hi = 9 52 println(x[lo:hi]) 53 } 54 55 func test4() { 56 defer mustRecover("interface") 57 var x interface{} = 1 58 println(x.(float32)) 59 } 60 61 type T struct { 62 a, b int 63 c []int 64 } 65 66 func test5() { 67 defer mustRecover("uncomparable") 68 var x T 69 var z interface{} = x 70 println(z != z) 71 } 72 73 func test6() { 74 defer mustRecover("unhashable") 75 var x T 76 var z interface{} = x 77 m := make(map[interface{}]int) 78 m[z] = 1 79 } 80 81 func test7() { 82 defer mustRecover("divide by zero") 83 var x, y int 84 println(x / y) 85 }