| // 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. | |
| // This file contains the code snippets included in "Error Handling and Go." | |
| package main | |
| import ( | |
| "encoding/json" | |
| "errors" | |
| "fmt" | |
| "log" | |
| "net" | |
| "os" | |
| "time" | |
| ) | |
| type File struct{} | |
| func Open(name string) (file *File, err error) { | |
| // OMIT | |
| panic(1) | |
| // STOP OMIT | |
| } | |
| func openFile() { // OMIT | |
| f, err := os.Open("filename.ext") | |
| if err != nil { | |
| log.Fatal(err) | |
| } | |
| // do something with the open *File f | |
| // STOP OMIT | |
| _ = f | |
| } | |
| // errorString is a trivial implementation of error. | |
| type errorString struct { | |
| s string | |
| } | |
| func (e *errorString) Error() string { | |
| return e.s | |
| } | |
| // STOP OMIT | |
| // New returns an error that formats as the given text. | |
| func New(text string) error { | |
| return &errorString{text} | |
| } | |
| // STOP OMIT | |
| func Sqrt(f float64) (float64, error) { | |
| if f < 0 { | |
| return 0, errors.New("math: square root of negative number") | |
| } | |
| // implementation | |
| return 0, nil // OMIT | |
| } | |
| // STOP OMIT | |
| func printErr() (int, error) { // OMIT | |
| f, err := Sqrt(-1) | |
| if err != nil { | |
| fmt.Println(err) | |
| } | |
| // STOP OMIT | |
| // fmtError OMIT | |
| if f < 0 { | |
| return 0, fmt.Errorf("math: square root of negative number %g", f) | |
| } | |
| // STOP OMIT | |
| return 0, nil | |
| } | |
| type NegativeSqrtError float64 | |
| func (f NegativeSqrtError) Error() string { | |
| return fmt.Sprintf("math: square root of negative number %g", float64(f)) | |
| } | |
| // STOP OMIT | |
| type SyntaxError struct { | |
| msg string // description of error | |
| Offset int64 // error occurred after reading Offset bytes | |
| } | |
| func (e *SyntaxError) Error() string { return e.msg } | |
| // STOP OMIT | |
| func decodeError(dec *json.Decoder, val struct{}) error { // OMIT | |
| var f os.FileInfo // OMIT | |
| if err := dec.Decode(&val); err != nil { | |
| if serr, ok := err.(*json.SyntaxError); ok { | |
| line, col := findLine(f, serr.Offset) | |
| return fmt.Errorf("%s:%d:%d: %v", f.Name(), line, col, err) | |
| } | |
| return err | |
| } | |
| // STOP OMIT | |
| return nil | |
| } | |
| func findLine(os.FileInfo, int64) (int, int) { | |
| // place holder; no need to run | |
| return 0, 0 | |
| } | |
| func netError(err error) { // OMIT | |
| for { // OMIT | |
| if nerr, ok := err.(net.Error); ok && nerr.Temporary() { | |
| time.Sleep(1e9) | |
| continue | |
| } | |
| if err != nil { | |
| log.Fatal(err) | |
| } | |
| // STOP OMIT | |
| } | |
| } | |
| func main() {} |