美文网首页
第13章 错误处理

第13章 错误处理

作者: yezide | 来源:发表于2020-01-20 16:48 被阅读0次

1、创建错误

package main

import (
    "errors"
    "fmt"
)


func main() {
    f := 0
    fr, error := Sqrt(f)
    if error != nil {
        fmt.Println("error: ", error)   
        return 
    }
    fmt.Println("result: ", fr)
}

func Sqrt(f int) (int, error) {
    if f <= 0 {
        return -1, errors.New("math - square root of negative number")
    }
    return f * f, nil
}

2、 恢复错误

package main

import (
    "fmt"
)


func main() {
    fmt.Printf("Calling test\r\n")
    test()
    fmt.Printf("Test completed\r\n")
}

func test() {
    defer func() {
        if e := recover(); e != nil {
            fmt.Printf("Panicing %s\n", e)
        }
    }()
    panic("bad end")
}

3、自定义错误处理

package main

import (
    "fmt"
    "strconv"
    "strings"
)

// 定义错误类型
type ParseError struct {
    Index int
    Word string
    Err error
}

// 定义错误输出
func (e *ParseError) String() string {
    return fmt.Sprintf("解析错误: 第%d位无法将[%s]解析为int", e.Index, e.Word)
}

// 解析函数, 将string元组中每个字符转换成int并返回相应的int元组
func Parse(input string) (numbers []int, err error) {
    defer func() {
        // 以下相当于java的finaly
        if r:= recover(); r != nil {
            var ok bool
            err, ok = r.(error)
            if !ok {
                // 转换错误语
                err = fmt.Errorf("解析错误: %v", r)
            }
        }
    }()
    // 获取各组string
    fields := strings.Fields(input)
    numbers = fileds2numbers(fields)
    return 
}

// 将元组中的string逐个转成int
func fileds2numbers(fileds []string) (numbers []int) {
    if len(fileds) == 0 {
        panic("数组长度为0")
    }
    for idx, filed := range fileds {
        num, err := strconv.Atoi(filed)
        if err != nil {
            // 此处相当于java的throw Exception
            panic(&ParseError{idx, filed, err})
        }
        numbers = append(numbers, num)
    }
    return 
}

func main() {
    var strs = []string{
        "1 2 3 4 ",
        "5 6 7",
        "2 + 2",
        "",
    }
    for _, line := range strs {
        fmt.Printf("开始解析 %q:\n  ", line)
        nums, err := Parse(line)
        if err != nil {
            fmt.Println(err) // here String() method from ParseError is used
            continue
        }
        fmt.Printf("解析结果:%v \n", nums)
    }
}

4、执行系统命令

package main

import (
    "fmt"   
    "os"
)

func main() {

    env := os.Environ()
    procAttr := &os.ProcAttr{
        Env: env,
        Files: []*os.File{
            os.Stdin,
            os.Stdout,
            os.Stderr,
        },
    }

    pid, err := os.StartProcess("/bin/ls", []string{"ls", "-l"}, procAttr)  
    if err != nil {
        fmt.Printf("Error %v starting process!", err)
        os.Exit(1)
    }
    fmt.Printf("The process id is %v", pid)
}

相关文章

网友评论

      本文标题:第13章 错误处理

      本文链接:https://www.haomeiwen.com/subject/wwbdzctx.html