欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Go基础编程实践(五)—— 错误和日志

程序员文章站 2022-03-26 12:11:57
自定义错误类型 Go中可以使用 创建错误信息,也可以通过创建自定义错误类型来满足需求。 是一个接口类型,所有实现该接口的类型都可以当作一个错误类型。 记录日志 捕获异常 ......

自定义错误类型

go中可以使用errors.new()创建错误信息,也可以通过创建自定义错误类型来满足需求。error是一个接口类型,所有实现该接口的类型都可以当作一个错误类型。

// error类型定义
type error interface {
    // error方法给出了错误描述
    error() string
}
package main

import "fmt"

// 创建一个表示错误的结构体类型,错误类型命名约定以error结尾
type myerror struct {
    shortmessage string
    detailedmessage string
}

// 实现error接口
// 引用传递以得到更好的内存管理
func (e *myerror) error() string {
    return e.shortmessage + "\n" + e.detailedmessage
}

func dosomething() error {
    return &myerror{shortmessage:"wohoo something happened!", detailedmessage:"file cannot found!"}
}

func main() {
    err := dosomething()
    // fmt.println在打印错误时会在内部调用error()方法,得到错误描述
    fmt.println(err)
}

记录日志

package main

import (
    "fmt"
    "log"
    "os"
)

func main() {
    logfile, err := os.create("logfile")
    if err != nil {
        fmt.println("an error occured...")
    }
    defer logfile.close()
    // setoutput设置标准logger的输出位置
    log.setoutput(logfile)
    log.println("doing some logging here...")
    // fatalln等价于调用println后调用os.exit(1).
    log.fatalln("fatal: application crashed!")
}

捕获异常

package main

import "fmt"

func main() {
    sayhello()
    fmt.println("after the panic was recovered!")
}

func sayhello() {
    defer func() {
        if r := recover(); r != nil {
            fmt.println("recovered in f", r)
        }
    }()
    writesomething()
}

func writesomething() {
    panic("write operation error")
}