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  }