blob: cad66b0702b3d49c0f338ef0c627fa8940452508 [file] [log] [blame]
Andrew Gerrand49d82b42011-12-12 13:15:29 +11001// Copyright 2011 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
Shenghou Macd54e442012-01-12 07:55:23 -08005// This file contains the code snippets included in "Defer, Panic, and Recover."
Andrew Gerrand49d82b42011-12-12 13:15:29 +11006
7package main
8
9import "fmt"
10import "io" // OMIT
11import "os" // OMIT
12
13func main() {
14 f()
15 fmt.Println("Returned normally from f.")
16}
17
18func f() {
19 defer func() {
20 if r := recover(); r != nil {
21 fmt.Println("Recovered in f", r)
22 }
23 }()
24 fmt.Println("Calling g.")
25 g(0)
26 fmt.Println("Returned normally from g.")
27}
28
29func g(i int) {
30 if i > 3 {
31 fmt.Println("Panicking!")
32 panic(fmt.Sprintf("%v", i))
33 }
34 defer fmt.Println("Defer in g", i)
35 fmt.Println("Printing in g", i)
36 g(i + 1)
37}
Andrew Gerrand468e6922012-01-09 20:05:34 +110038
Andrew Gerrand49d82b42011-12-12 13:15:29 +110039// STOP OMIT
40
41// Revised version.
42func CopyFile(dstName, srcName string) (written int64, err error) {
43 src, err := os.Open(srcName)
44 if err != nil {
45 return
46 }
47 defer src.Close()
48
49 dst, err := os.Create(dstName)
50 if err != nil {
51 return
52 }
53 defer dst.Close()
54
55 return io.Copy(dst, src)
56}
Andrew Gerrand468e6922012-01-09 20:05:34 +110057
Andrew Gerrand49d82b42011-12-12 13:15:29 +110058// STOP OMIT