github.com/huandu/go@v0.0.0-20151114150818-04e615e41150/doc/progs/error4.go (about)

     1  // 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  
     5  // This file contains the code snippets included in "Error Handling and Go."
     6  
     7  package main
     8  
     9  import (
    10  	"net/http"
    11  	"text/template"
    12  )
    13  
    14  type appError struct {
    15  	Error   error
    16  	Message string
    17  	Code    int
    18  }
    19  
    20  // STOP OMIT
    21  
    22  type appHandler func(http.ResponseWriter, *http.Request) *appError
    23  
    24  func (fn appHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    25  	if e := fn(w, r); e != nil { // e is *appError, not error.
    26  		c := appengine.NewContext(r)
    27  		c.Errorf("%v", e.Error)
    28  		http.Error(w, e.Message, e.Code)
    29  	}
    30  }
    31  
    32  // STOP OMIT
    33  
    34  func viewRecord(w http.ResponseWriter, r *http.Request) *appError {
    35  	c := appengine.NewContext(r)
    36  	key := datastore.NewKey(c, "Record", r.FormValue("id"), 0, nil)
    37  	record := new(Record)
    38  	if err := datastore.Get(c, key, record); err != nil {
    39  		return &appError{err, "Record not found", 404}
    40  	}
    41  	if err := viewTemplate.Execute(w, record); err != nil {
    42  		return &appError{err, "Can't display record", 500}
    43  	}
    44  	return nil
    45  }
    46  
    47  // STOP OMIT
    48  
    49  func init() {
    50  	http.Handle("/view", appHandler(viewRecord))
    51  }
    52  
    53  type ap struct{}
    54  
    55  func (ap) NewContext(*http.Request) *ctx { return nil }
    56  
    57  type ctx struct{}
    58  
    59  func (*ctx) Errorf(string, ...interface{}) {}
    60  
    61  var appengine ap
    62  
    63  type ds struct{}
    64  
    65  func (ds) NewKey(*ctx, string, string, int, *int) string { return "" }
    66  func (ds) Get(*ctx, string, *Record) error               { return nil }
    67  
    68  var datastore ds
    69  
    70  type Record struct{}
    71  
    72  var viewTemplate *template.Template
    73  
    74  func main() {}