1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- // 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 (
- "net/http"
- "text/template"
- )
- type appError struct {
- Error error
- Message string
- Code int
- }
- // STOP OMIT
- type appHandler func(http.ResponseWriter, *http.Request) *appError
- func (fn appHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
- if e := fn(w, r); e != nil { // e is *appError, not error.
- c := appengine.NewContext(r)
- c.Errorf("%v", e.Error)
- http.Error(w, e.Message, e.Code)
- }
- }
- // STOP OMIT
- func viewRecord(w http.ResponseWriter, r *http.Request) *appError {
- c := appengine.NewContext(r)
- key := datastore.NewKey(c, "Record", r.FormValue("id"), 0, nil)
- record := new(Record)
- if err := datastore.Get(c, key, record); err != nil {
- return &appError{err, "Record not found", 404}
- }
- if err := viewTemplate.Execute(w, record); err != nil {
- return &appError{err, "Can't display record", 500}
- }
- return nil
- }
- // STOP OMIT
- func init() {
- http.Handle("/view", appHandler(viewRecord))
- }
- type ap struct{}
- func (ap) NewContext(*http.Request) *ctx { return nil }
- type ctx struct{}
- func (*ctx) Errorf(string, ...interface{}) {}
- var appengine ap
- type ds struct{}
- func (ds) NewKey(*ctx, string, string, int, *int) string { return "" }
- func (ds) Get(*ctx, string, *Record) error { return nil }
- var datastore ds
- type Record struct{}
- var viewTemplate *template.Template
- func main() {}
|