| 
									
										
										
										
											2011-12-12 13:15:29 +11:00
										 |  |  | // Copyright 2011 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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-12 07:55:23 -08:00
										 |  |  | // This file contains the code snippets included in "Defer, Panic, and Recover." | 
					
						
							| 
									
										
										
										
											2011-12-12 13:15:29 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import "fmt" | 
					
						
							|  |  |  | import "io" // OMIT | 
					
						
							|  |  |  | import "os" // OMIT | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func main() { | 
					
						
							|  |  |  | 	f() | 
					
						
							|  |  |  | 	fmt.Println("Returned normally from f.") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func f() { | 
					
						
							|  |  |  | 	defer func() { | 
					
						
							|  |  |  | 		if r := recover(); r != nil { | 
					
						
							|  |  |  | 			fmt.Println("Recovered in f", r) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}() | 
					
						
							|  |  |  | 	fmt.Println("Calling g.") | 
					
						
							|  |  |  | 	g(0) | 
					
						
							|  |  |  | 	fmt.Println("Returned normally from g.") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func g(i int) { | 
					
						
							|  |  |  | 	if i > 3 { | 
					
						
							|  |  |  | 		fmt.Println("Panicking!") | 
					
						
							|  |  |  | 		panic(fmt.Sprintf("%v", i)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer fmt.Println("Defer in g", i) | 
					
						
							|  |  |  | 	fmt.Println("Printing in g", i) | 
					
						
							|  |  |  | 	g(i + 1) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2012-01-09 20:05:34 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-12 13:15:29 +11:00
										 |  |  | // STOP OMIT | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Revised version. | 
					
						
							|  |  |  | func CopyFile(dstName, srcName string) (written int64, err error) { | 
					
						
							|  |  |  | 	src, err := os.Open(srcName) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer src.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	dst, err := os.Create(dstName) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer dst.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return io.Copy(dst, src) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2012-01-09 20:05:34 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-12 13:15:29 +11:00
										 |  |  | // STOP OMIT |