// 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 of recover for run-time errors. | |
// TODO(rsc): | |
// null pointer accesses | |
package main | |
import "strings" | |
var x = make([]byte, 10) | |
func main() { | |
test1() | |
test2() | |
test3() | |
test4() | |
test5() | |
test6() | |
test7() | |
} | |
func mustRecover(s string) { | |
v := recover() | |
if v == nil { | |
panic("expected panic") | |
} | |
if e := v.(error).Error(); strings.Index(e, s) < 0 { | |
panic("want: " + s + "; have: " + e) | |
} | |
} | |
func test1() { | |
defer mustRecover("index") | |
println(x[123]) | |
} | |
func test2() { | |
defer mustRecover("slice") | |
println(x[5:15]) | |
} | |
func test3() { | |
defer mustRecover("slice") | |
var lo = 11 | |
var hi = 9 | |
println(x[lo:hi]) | |
} | |
func test4() { | |
defer mustRecover("interface") | |
var x interface{} = 1 | |
println(x.(float32)) | |
} | |
type T struct { | |
a, b int | |
c []int | |
} | |
func test5() { | |
defer mustRecover("uncomparable") | |
var x T | |
var z interface{} = x | |
println(z != z) | |
} | |
func test6() { | |
defer mustRecover("unhashable") | |
var x T | |
var z interface{} = x | |
m := make(map[interface{}]int) | |
m[z] = 1 | |
} | |
func test7() { | |
defer mustRecover("divide by zero") | |
var x, y int | |
println(x / y) | |
} |