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 12package main 13 14import "strings" 15 16var x = make([]byte, 10) 17 18func main() { 19 test1() 20 test2() 21 test3() 22 test4() 23 test5() 24 test6() 25 test7() 26} 27 28func 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 38func test1() { 39 defer mustRecover("index") 40 println(x[123]) 41} 42 43func test2() { 44 defer mustRecover("slice") 45 println(x[5:15]) 46} 47 48func test3() { 49 defer mustRecover("slice") 50 var lo = 11 51 var hi = 9 52 println(x[lo:hi]) 53} 54 55func test4() { 56 defer mustRecover("interface") 57 var x interface{} = 1 58 println(x.(float32)) 59} 60 61type T struct { 62 a, b int 63 c []int 64} 65 66func test5() { 67 defer mustRecover("uncomparable") 68 var x T 69 var z interface{} = x 70 println(z != z) 71} 72 73func test6() { 74 defer mustRecover("unhashable type main.T") 75 var x T 76 var z interface{} = x 77 m := make(map[interface{}]int) 78 m[z] = 1 79} 80 81func test7() { 82 defer mustRecover("divide by zero") 83 var x, y int 84 println(x / y) 85} 86