go recover3 源码

  • 2022-07-15
  • 浏览 (868)

golang recover3 代码

文件路径:/test/recover3.go

// run

// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Test recovering from runtime errors.

package main

import (
	"runtime"
	"strings"
)

var didbug bool

func bug() {
	if didbug {
		return
	}
	println("BUG")
	didbug = true
}

func check(name string, f func(), err string) {
	defer func() {
		v := recover()
		if v == nil {
			bug()
			println(name, "did not panic")
			return
		}
		runt, ok := v.(runtime.Error)
		if !ok {
			bug()
			println(name, "panicked but not with runtime.Error")
			return
		}
		s := runt.Error()
		if strings.Index(s, err) < 0 {
			bug()
			println(name, "panicked with", s, "not", err)
			return
		}
	}()

	f()
}

func main() {
	var x int
	var x64 int64
	var p *[10]int
	var q *[10000]int
	var i int

	check("int-div-zero", func() { println(1 / x) }, "integer divide by zero")
	check("int64-div-zero", func() { println(1 / x64) }, "integer divide by zero")

	check("nil-deref", func() { println(p[0]) }, "nil pointer dereference")
	check("nil-deref-1", func() { println(p[1]) }, "nil pointer dereference")
	check("nil-deref-big", func() { println(q[5000]) }, "nil pointer dereference")

	i = 99999
	var sl []int
	p1 := new([10]int)
	check("array-bounds", func() { println(p1[i]) }, "index out of range")
	check("slice-bounds", func() { println(sl[i]) }, "index out of range")

	var inter interface{}
	inter = 1
	check("type-concrete", func() { println(inter.(string)) }, "int, not string")
	check("type-interface", func() { println(inter.(m)) }, "missing method m")

	if didbug {
		panic("recover3")
	}
}

type m interface {
	m()
}

相关信息

go 源码目录

相关文章

go 235 源码

go 64bit 源码

go alg 源码

go alias 源码

go alias1 源码

go alias2 源码

go alias3 源码

go align 源码

go append 源码

go append1 源码

0  赞