1// Copyright 2012 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 5package errors_test 6 7import ( 8 "errors" 9 "fmt" 10 "io/fs" 11 "os" 12 "time" 13) 14 15// MyError is an error implementation that includes a time and message. 16type MyError struct { 17 When time.Time 18 What string 19} 20 21func (e MyError) Error() string { 22 return fmt.Sprintf("%v: %v", e.When, e.What) 23} 24 25func oops() error { 26 return MyError{ 27 time.Date(1989, 3, 15, 22, 30, 0, 0, time.UTC), 28 "the file system has gone away", 29 } 30} 31 32func Example() { 33 if err := oops(); err != nil { 34 fmt.Println(err) 35 } 36 // Output: 1989-03-15 22:30:00 +0000 UTC: the file system has gone away 37} 38 39func ExampleNew() { 40 err := errors.New("emit macho dwarf: elf header corrupted") 41 if err != nil { 42 fmt.Print(err) 43 } 44 // Output: emit macho dwarf: elf header corrupted 45} 46 47// The fmt package's Errorf function lets us use the package's formatting 48// features to create descriptive error messages. 49func ExampleNew_errorf() { 50 const name, id = "bimmler", 17 51 err := fmt.Errorf("user %q (id %d) not found", name, id) 52 if err != nil { 53 fmt.Print(err) 54 } 55 // Output: user "bimmler" (id 17) not found 56} 57 58func ExampleJoin() { 59 err1 := errors.New("err1") 60 err2 := errors.New("err2") 61 err := errors.Join(err1, err2) 62 fmt.Println(err) 63 if errors.Is(err, err1) { 64 fmt.Println("err is err1") 65 } 66 if errors.Is(err, err2) { 67 fmt.Println("err is err2") 68 } 69 // Output: 70 // err1 71 // err2 72 // err is err1 73 // err is err2 74} 75 76func ExampleIs() { 77 if _, err := os.Open("non-existing"); err != nil { 78 if errors.Is(err, fs.ErrNotExist) { 79 fmt.Println("file does not exist") 80 } else { 81 fmt.Println(err) 82 } 83 } 84 85 // Output: 86 // file does not exist 87} 88 89func ExampleAs() { 90 if _, err := os.Open("non-existing"); err != nil { 91 var pathError *fs.PathError 92 if errors.As(err, &pathError) { 93 fmt.Println("Failed at path:", pathError.Path) 94 } else { 95 fmt.Println(err) 96 } 97 } 98 99 // Output: 100 // Failed at path: non-existing 101} 102 103func ExampleUnwrap() { 104 err1 := errors.New("error1") 105 err2 := fmt.Errorf("error2: [%w]", err1) 106 fmt.Println(err2) 107 fmt.Println(errors.Unwrap(err2)) 108 // Output: 109 // error2: [error1] 110 // error1 111} 112