网站建设资讯

NEWS

网站建设资讯

go的语言错误处理 go语言错误处理会变吗

Go 语言的错误处理机制是一个优秀的设计吗

只是Go里面的Error Check比较不直观而已,其实可以封装一层让它更好看的。比如Rust的ResultT, E,它包含了一个Ok(..)和Err(..),Ok表示正确,然后带有正确的返回值,而Err则表示错误,然后带着错误信息。这样处理起来就比较好看了,你可以选择忽略它,让程序直接在出错的地方挂掉,像这样someFunctionMayFail().unwrap(); // 要是出错了,就直接挂掉

创新互联建站是一家专业提供安康企业网站建设,专注与成都网站设计、成都做网站、H5技术、小程序制作等业务。10年已为安康众多企业、政府机构等服务。创新互联专业网站制作公司优惠进行中。

或者在挂掉的时候,带一个自己的出错信息someFunctionMayFail().ok().expect("Expecting a xxxxx");

或者自己处理let return_val = match someFunctionMayFail() {

Ok(v) = v,

Err(err) = {

// Deal with the error

// for example:

// fail!("Fail!!!! {}", err);

}

};

当然,我不是说它和Go的那个Error Check有什么本质的区别,反正都是处理错误,但是我个人觉得Rust这样写更舒服。

go 的错误处理 error

error 是一种内建的接口类型,不需要引用 任何包就可以直接使用。error 接口只声明了一个 Error 方法,任何实现了该方法的结构体都可以作为 error 来使用。

标准库 errors 包中的 errorString 就是实现了 error 接口的一个例子:

针对 error 而言,异常处理包括如何检查错误,如何传递错误。

为了解决这一问题,Go 1.13 中引入了对error的优化,最核心的内容就是引入了 wrapError 这一新的 error 类型。

go的错误码处理

目录结构: 都在src的目录下

主要是web.go 和http.go 的交互,fbn.go做了一个简单的斐波那契数列

先看web.go:

```

package main //入口

import (

"exdefer/filelistenserver/fileting"

"log"

"net/http"

"os"

)

type appHandler func(writer http.ResponseWriter, request *http.Request) error   //定义一个实现错误的方法

func errW(handler appHandler) func(writer http.ResponseWriter, request *http.Request) { //实现上面的方法

return func(writer http.ResponseWriter, request *http.Request) {

err := handler(writer, request) //http 的response 和request   设置一个错误的返回值

if err != nil { // 判断一下

log.Print("Print array ", err.Error(), "\n") //打印log

code := http.StatusOK //code 默认设置成200

switch { //switch选择

case os.IsNotExist(err): //如果输入的这个文件不存在

code = http.StatusNotFound //404

case os.IsPermission(err): //如果权限不够

code = http.StatusForbidden //403

default: //否则的话

code = http.StatusInternalServerError //500

}

http.Error(writer, http.StatusText(code), code) //输出 第一个参数 是response,第二个是 错误描述,返回的状态码 在swoole里面是$response-end("") /状态码是$response-status("");大同小异

}

}

}

func main() {

//第一个值是你要走的url目录 swoole里面通过document_root 进行设置

http.HandleFunc("/list/", errW(fileting.Handlist)) //调用的http.go的包

err := http.ListenAndServe(":8888", nil) //监听的端口 第二个值一般给nil

if err != nil {

panic(err)

}

}

```

http.go

```

package fileting //声明包

import (

"io/ioutil"

"net/http"

"os"

)

func Handlist(writer http.ResponseWriter, request *http.Request) error { //方法 返回一个error

path := request.URL.Path[len("/list/"):] //切片 path访问为localhost:8888/list/xxx.txt 中的xxx.txt

file, err := os.Open(path) //分开写了,两个返回值

if err != nil {

//http.Error(writer, err.Error(), http.StatusInternalServerError)

return err //直接return err

}

defer file.Close() //defer 一下  open完要记得

all, err := ioutil.ReadAll(file) //对文件的读取

if err != nil {

//panic(err)

return err

}

writer.Write(all) //reponse 里面的write 类似swoole $response-end()

return nil //如果没有错误返回nil

}

```

演示一下:

今日的学习,结束

每天一个知识点:Go 语言的五种错误处理策略

当一个函数调用返回一个错误时,调用者应当负责检查错误并采取合适的处理应对。根据情形,将有许多可能的处理场景。接下来我们看 5 个策略:

Go 语言的错误处理有特定的规律。进行错误检查之后,检测到失败的情况往往都在成功之前。如果检测到的失败导致函数返回,成功的逻辑一般不会放在 else 块中而是在外层的作用域中。函数会有一种通常的形式,就是在开头有一连串的检查来返回错误,之后跟着实际的函数体一直到最后。


本文名称:go的语言错误处理 go语言错误处理会变吗
文章来源:http://cdweb.net/article/ddodpce.html