| // 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 type main.T") | |
| 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) | |
| } |