// 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() {}