gobyexample-errors

1823 ワード

ソース:https://github.com/xg-wang/gobyexample/tree/master/examples
//   Go               、             。
//      (exception)  Java   Ruby,    C         
//  (overloaded)    /          。
//Go                       ,           
//       

package main

import (
    "errors"
    "fmt"
)

//    ,                `error`  ,       
func f1(arg int) (int, error) {
    if arg == 42 {
        //`errors.New`                 `error` 
        return -1, errors.New("can't work with 42")
    }
    //      nil       
    return arg + 3, nil
}

//     `Error`        `error`      。
//                        
type argError struct {
    arg  int
    prob string
}

func (e *argError) Error() string {
    return fmt.Sprintf("%d - %s", e.arg, e.prob)
}

func f2(arg int) (int, error) {
    if arg == 42 {
        //  `&argError`            ,    `arg` `prob`       
        return -1, &argError{arg, "can't work with it"}
    }
    return arg + 3, nil
}

func main() {
    for _, i := range []int{7, 42} {
        //         ,  Go          
        if r, e := f1(i); e != nil {
            fmt.Println("f1 failed:", e)
        } else {
            fmt.Println("f1 worked:", r)
        }

    }

    for _, i := range []int{7, 42} {
        if r, e := f2(i); e != nil {
            fmt.Println("f2 failed:", e)
        } else {
            fmt.Println("f2 worked:", r)
        }
    }
    //                     ,    【    】            
    _, e := f2(42)
    if ae, ok := e.(*argError); ok {
        fmt.Println(ae.arg)
        fmt.Println(ae.prob)
    }

}


出力結果:
f1 worked: 10
f1 failed: can't work with 42
f2 worked: 10
f2 failed: 42 - can't work with it
42
can't work with it