// Copyright 2009 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. package eval import ( "fmt"; "os"; "runtime"; ) // Abort aborts the thread's current computation, // causing the innermost Try to return err. func (t *Thread) Abort(err os.Error) { if t.abort == nil { panicln("abort:", err.String()); } t.abort <- err; runtime.Goexit(); } // Try executes a computation; if the computation // Aborts, Try returns the error passed to abort. func (t *Thread) Try(f func(t *Thread)) os.Error { oc := t.abort; c := make(chan os.Error); t.abort = c; go func() { f(t); c <- nil; }(); err := <-c; t.abort = oc; return err; } type DivByZeroError struct {} func (DivByZeroError) String() string { return "divide by zero"; } type NilPointerError struct {} func (NilPointerError) String() string { return "nil pointer dereference"; } type IndexError struct { Idx, Len int64; } func (e IndexError) String() string { if e.Idx < 0 { return fmt.Sprintf("negative index: %d", e.Idx); } return fmt.Sprintf("index %d exceeds length %d", e.Idx, e.Len); } type KeyError struct { Key interface {}; } func (e KeyError) String() string { return fmt.Sprintf("key '%v' not found in map", e.Key); } type NegativeLengthError struct { Len int64; } func (e NegativeLengthError) String() string { return fmt.Sprintf("negative length: %d", e.Len); } type NegativeCapacityError struct { Len int64; } func (e NegativeCapacityError) String() string { return fmt.Sprintf("negative capacity: %d", e.Len); }