github.com/yanyiwu/go@v0.0.0-20150106053140-03d6637dbb7f/test/recover3.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 recovering from runtime errors.
     8  
     9  package main
    10  
    11  import (
    12  	"runtime"
    13  	"strings"
    14  )
    15  
    16  var didbug bool
    17  
    18  func bug() {
    19  	if didbug {
    20  		return
    21  	}
    22  	println("BUG")
    23  	didbug = true
    24  }
    25  
    26  func check(name string, f func(), err string) {
    27  	defer func() {
    28  		v := recover()
    29  		if v == nil {
    30  			bug()
    31  			println(name, "did not panic")
    32  			return
    33  		}
    34  		runt, ok := v.(runtime.Error)
    35  		if !ok {
    36  			bug()
    37  			println(name, "panicked but not with runtime.Error")
    38  			return
    39  		}
    40  		s := runt.Error()
    41  		if strings.Index(s, err) < 0 {
    42  			bug()
    43  			println(name, "panicked with", s, "not", err)
    44  			return
    45  		}
    46  	}()
    47  
    48  	f()
    49  }
    50  
    51  func main() {
    52  	var x int
    53  	var x64 int64
    54  	var p *[10]int
    55  	var q *[10000]int
    56  	var i int
    57  
    58  	check("int-div-zero", func() { println(1 / x) }, "integer divide by zero")
    59  	check("int64-div-zero", func() { println(1 / x64) }, "integer divide by zero")
    60  
    61  	check("nil-deref", func() { println(p[0]) }, "nil pointer dereference")
    62  	check("nil-deref-1", func() { println(p[1]) }, "nil pointer dereference")
    63  	check("nil-deref-big", func() { println(q[5000]) }, "nil pointer dereference")
    64  
    65  	i = 99999
    66  	var sl []int
    67  	p1 := new([10]int)
    68  	check("array-bounds", func() { println(p1[i]) }, "index out of range")
    69  	check("slice-bounds", func() { println(sl[i]) }, "index out of range")
    70  
    71  	var inter interface{}
    72  	inter = 1
    73  	check("type-concrete", func() { println(inter.(string)) }, "int, not string")
    74  	check("type-interface", func() { println(inter.(m)) }, "missing method m")
    75  
    76  	if didbug {
    77  		panic("recover3")
    78  	}
    79  }
    80  
    81  type m interface {
    82  	m()
    83  }