十年網站開發(fā)經驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網站問題一站解決
只是Go里面的Error Check比較不直觀而已,其實可以封裝一層讓它更好看的。比如Rust的ResultT, E,它包含了一個Ok(..)和Err(..),Ok表示正確,然后帶有正確的返回值,而Err則表示錯誤,然后帶著錯誤信息。這樣處理起來就比較好看了,你可以選擇忽略它,讓程序直接在出錯的地方掛掉,像這樣someFunctionMayFail().unwrap(); // 要是出錯了,就直接掛掉
創(chuàng)新互聯建站是一家專業(yè)提供安康企業(yè)網站建設,專注與成都網站設計、成都做網站、H5技術、小程序制作等業(yè)務。10年已為安康眾多企業(yè)、政府機構等服務。創(chuàng)新互聯專業(yè)網站制作公司優(yōu)惠進行中。
或者在掛掉的時候,帶一個自己的出錯信息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有什么本質的區(qū)別,反正都是處理錯誤,但是我個人覺得Rust這樣寫更舒服。
error 是一種內建的接口類型,不需要引用 任何包就可以直接使用。error 接口只聲明了一個 Error 方法,任何實現了該方法的結構體都可以作為 error 來使用。
標準庫 errors 包中的 errorString 就是實現了 error 接口的一個例子:
針對 error 而言,異常處理包括如何檢查錯誤,如何傳遞錯誤。
為了解決這一問題,Go 1.13 中引入了對error的優(yōu)化,最核心的內容就是引入了 wrapError 這一新的 error 類型。
目錄結構: 都在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,第二個是 錯誤描述,返回的狀態(tài)碼 在swoole里面是$response-end("") /狀態(tài)碼是$response-status("");大同小異
}
}
}
func main() {
//第一個值是你要走的url目錄 swoole里面通過document_root 進行設置
http.HandleFunc("/list/", errW(fileting.Handlist)) //調用的http.go的包
err := http.ListenAndServe(":8888", nil) //監(jiān)聽的端口 第二個值一般給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
}
```
演示一下:
今日的學習,結束
當一個函數調用返回一個錯誤時,調用者應當負責檢查錯誤并采取合適的處理應對。根據情形,將有許多可能的處理場景。接下來我們看 5 個策略:
Go 語言的錯誤處理有特定的規(guī)律。進行錯誤檢查之后,檢測到失敗的情況往往都在成功之前。如果檢測到的失敗導致函數返回,成功的邏輯一般不會放在 else 塊中而是在外層的作用域中。函數會有一種通常的形式,就是在開頭有一連串的檢查來返回錯誤,之后跟著實際的函數體一直到最后。