最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang中的錯(cuò)誤處理的示例詳解

 更新時(shí)間:2022年12月14日 09:36:25   作者:夢(mèng)想畫(huà)家  
這篇文章主要為大家詳細(xì)介紹了Golang中的錯(cuò)誤處理的相關(guān)資料,文章中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Golang有一定幫助,需要的可以參考一下

本文介紹Golang錯(cuò)誤處理機(jī)制,包括不同類(lèi)型錯(cuò)誤處理、定義運(yùn)行時(shí)錯(cuò)誤等內(nèi)容。

golang錯(cuò)誤處理機(jī)制

Go錯(cuò)誤處理類(lèi)似C語(yǔ)言,沒(méi)有提供任何異常,以及類(lèi)java語(yǔ)言使用的try/catch異常處理機(jī)制。go異常處理僅簡(jiǎn)化為預(yù)定義的Error類(lèi)型,Go沒(méi)有提供異常處理機(jī)制,不能拋出類(lèi)似許多其他語(yǔ)言的異常。相反,Golang集成了新的錯(cuò)誤處理機(jī)制,如panic 和 recovery。

error類(lèi)型

error類(lèi)型僅包括Error方法,返回string類(lèi)型標(biāo)識(shí)具體的錯(cuò)誤信息。代碼如下:

// The built-in error interface is a regular interface for handling errors. 
// where nil means no errors. 
type error interface { 
    Error() string 
}

我們看到錯(cuò)誤處理類(lèi)型實(shí)際上是一個(gè)接口,包含一個(gè)簡(jiǎn)單的error()方法,其返回值是一個(gè)字符串。通過(guò)定義可知:要實(shí)現(xiàn)錯(cuò)誤處理,只需要向error()方法返回一個(gè)簡(jiǎn)單的字符串。

示例

下面先看一個(gè)錯(cuò)誤處理示例:

func main() {
    conent, err := openFile()
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(string(conent))
    }
}

只要 err!= nil (檢測(cè)到存在錯(cuò)誤), 它將從執(zhí)行中終止,否則繼續(xù)正常的執(zhí)行流。

Go中很多函數(shù)返回多個(gè)值,通常其中一個(gè)返回值是錯(cuò)誤類(lèi)型。舉例: strconv.Atoi(),轉(zhuǎn)換字符串?dāng)?shù)據(jù)為數(shù)值類(lèi)型,返回兩個(gè)值,第一個(gè)是轉(zhuǎn)換結(jié)果,第二個(gè)是錯(cuò)誤。如果正常轉(zhuǎn)換,第二個(gè)返回值為nil。反之轉(zhuǎn)換失敗,可從錯(cuò)誤中獲得錯(cuò)誤原因。

下面示例檢查用戶(hù)輸入數(shù)據(jù)是否為數(shù)值,通過(guò)示例可以學(xué)習(xí)如何處理錯(cuò)誤:

package main
import (
    "fmt"
    "strconv"
)
func main() {
	var input string
	fmt.Print("Type some number: ")
	fmt.Scanln(&input)
	number, err := strconv.Atoi(input)
	if err == nil {
		fmt.Println(number, "is number")
	} else {
		fmt.Println(input, "is not number")
		fmt.Println(err.Error())
	}
}

如果有錯(cuò)誤顯示錯(cuò)誤信息,反之輸出結(jié)果。

創(chuàng)建錯(cuò)誤對(duì)象

內(nèi)置方法

除了內(nèi)置函數(shù)返回錯(cuò)誤,我們可以創(chuàng)建錯(cuò)誤,主要有兩種方法:

  • errors.New()
  • fmt.Errorf()

下面示例展示如何自定義錯(cuò)誤對(duì)象。首先提供一個(gè)validate()對(duì)象,之后用于檢查用戶(hù)數(shù)是否為空,如果為空產(chǎn)生錯(cuò)誤:

func validate(input string) (bool, error) {
	if strings.TrimSpace(input) == "" {
		return false, fmt.Errorf("%s can't be empty", input)
		//return false, errors.New("cannot be empty")
	}
	return true, nil
}
func main() {
	var name string
	fmt.Print("Type your name: \n")
	fmt.Scanln(&name)
	if valid, err := validate(name); valid {
		fmt.Println("hello", name)
	} else {
		fmt.Println(err.Error())
	}
}

第三方庫(kù)

有時(shí)需要在錯(cuò)誤對(duì)象上增加額外信息:

import "github.com/pkg/errors"
internal := errors.New("internal error")
// 給error增加其他上下文信息
wrapped := errors.Wrap(internal, "wrapper")
// 獲得原始錯(cuò)誤信息
unwrapped := errors.Cause(wrapped)

pkg/errors是內(nèi)置errors的替代工具,盡管內(nèi)置error也提供了類(lèi)似功能:

import "errors"
internal := errors.New("internal error")
// add additional context to an error
wrapped := fmt.Errorf("wrapper: %w", internal)
// get original error
unwrapped := errors.Unwrap(wrapped)

但內(nèi)置功能相對(duì)較少,建議直接使用pkg/errors.

完整示例:

import (
	"fmt"
	"github.com/pkg/errors"
	"strings"
)
func validate(input string) (bool, error) {
	if strings.TrimSpace(input) == "" {
		err := errors.New("can't be empty")
		return false, errors.Wrap(err, "input error")
	}
	return true, nil
}
func main() {
	var name string
	fmt.Print("Type your name: \n")
	fmt.Scanln(&name)
	if valid, err := validate(name); valid {
		fmt.Println("hello", name)
	} else {
		fmt.Println(errors.Unwrap(err))
	}
}

panic

panic是Go內(nèi)置函數(shù),類(lèi)似其他語(yǔ)言的異常。當(dāng)運(yùn)行時(shí)出現(xiàn)該函數(shù),則程序在該點(diǎn)終止。

聲明panic

go代碼中遇到panic時(shí),不再繼續(xù)執(zhí)行。這種這種場(chǎng)景可以使用內(nèi)置panic函數(shù):

func panic( interface{} )

可以傳入字符串或其他類(lèi)型參數(shù),情況示例:

package main
import  "fmt"
func main() {
    fmt.Println("start Go program")
    panic(" built in panic keyword gives error msg")  // panic keyword
    fmt.Println("End Go program")
    }

內(nèi)置操作

package main
import (
 "fmt"
)
func main() {
    a,b := 1,0   // variable a & b are declared and initialized
    result := a/b        // division operation
    fmt.Println(result)
}

上面代碼因?yàn)槌龜?shù)為0,程序終止并報(bào)錯(cuò):panic: runtime error: integer divide by zero

另外方法slice時(shí),索引超出范圍時(shí)也會(huì)panic:

package main
import "fmt"
func main() {
    names := []string{  //slice data type
        "Learn eTutorials",     // index 0
        "Golang",  //index 1
        "panic tutorial", //index 2
    }
    //fmt.Println(names[0]) commented
    //fmt.Println(names[2]) commented
    fmt.Println(names[4]) //panic: runtime error: index out of range [4] with length 3
}

那么時(shí)間使用panic函數(shù)呢?

  • 當(dāng)程序不能繼續(xù)執(zhí)行時(shí)使用。舉例,web服務(wù)器不能綁定特定端口。
  • 程序出錯(cuò)時(shí)使用。舉例,假設(shè)方法接收指針類(lèi)型參數(shù),實(shí)際調(diào)用時(shí)傳入nil。

panic與defer

還是從示例開(kāi)始吧:

func Name(firstName *string, lastName *string) {
	defer fmt.Println("Name function deferred call")
	if firstName == nil {
		panic("runtime error: first name cannot be nil")
	}
	if lastName == nil {
		panic("runtime error: last name cannot be nil")
	}
	fmt.Printf("%s %s\n", *firstName, *lastName)
	fmt.Println("return from Name")
}
func main() {
	defer fmt.Println("main() deffered call")
	firstName := "Elon"
	Name(&firstName, nil)
	fmt.Println("return from main")
}

輸出結(jié)果為:

Name function deferred call
main() deffered call
panic: runtime error: last name cannot be nil

我們看到多個(gè)defer,類(lèi)似棧,先進(jìn)后出。panic總是讓所有defer執(zhí)行完畢后才拋出。

recover

前面我們看了error和panic兩類(lèi)異常,前者類(lèi)似java中的運(yùn)行時(shí)異常,后者類(lèi)似于非運(yùn)行時(shí)異常。error我們可以捕獲或忽略,但panic要么終止運(yùn)行,要么手動(dòng)恢復(fù),也就是手動(dòng)處理這類(lèi)錯(cuò)誤,如給用戶(hù)提示。下面同時(shí)示例來(lái)說(shuō)明:

func main() {
	fmt.Println("lets learn about recover() in golang")
	Panicfunc()
	fmt.Println("learned all about recover() ")
}
func Panicfunc() {
	defer Panicrecover()
	fmt.Println("instruction just before panicking situation")
	panic("Panicfunc  resume  execution")
	fmt.Println("instruction after panic does not execute")
}
func Panicrecover() {
	if err := recover(); err != nil {
		fmt.Printf("Recovered from panic: %v \n", err)
	}
}

輸出結(jié)果:

lets learn about recover() in golang
instruction just before panicking situation        
Recovered from panic: Panicfunc  resume  execution 
learned all about recover()              

我們看到panic之后代碼不會(huì)執(zhí)行,但recover捕獲的錯(cuò)誤處理代碼能夠執(zhí)行。

到此這篇關(guān)于Golang中的錯(cuò)誤處理的示例詳解的文章就介紹到這了,更多相關(guān)Go錯(cuò)誤處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語(yǔ)言中XML文件的讀寫(xiě)操作

    Go語(yǔ)言中XML文件的讀寫(xiě)操作

    本文主要介紹了Go語(yǔ)言中XML文件的讀寫(xiě)操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • windows下使用GoLand生成proto文件的方法步驟

    windows下使用GoLand生成proto文件的方法步驟

    本文主要介紹了windows下使用GoLand生成proto文件的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 使用Gomock進(jìn)行單元測(cè)試的方法示例

    使用Gomock進(jìn)行單元測(cè)試的方法示例

    這篇文章主要介紹了使用Gomock進(jìn)行單元測(cè)試的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • Golang實(shí)現(xiàn)WebSocket服務(wù)的項(xiàng)目實(shí)踐

    Golang實(shí)現(xiàn)WebSocket服務(wù)的項(xiàng)目實(shí)踐

    本文介紹如何使用Golang實(shí)現(xiàn)實(shí)時(shí)后端WebSocket服務(wù),首先使用Gin框架搭建http服務(wù),然后使用gorilla/websocket庫(kù)實(shí)現(xiàn)簡(jiǎn)單后端WebSocket服務(wù),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-05-05
  • golang讀取文件的常用方法總結(jié)

    golang讀取文件的常用方法總結(jié)

    今天小編就為大家分享一篇關(guān)于golang讀取文件的常用方法總結(jié),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • 使用Singleflight實(shí)現(xiàn)Golang代碼優(yōu)化

    使用Singleflight實(shí)現(xiàn)Golang代碼優(yōu)化

    有許多方法可以?xún)?yōu)化代碼以提高效率,減少運(yùn)行進(jìn)程就是其中之一,本文我們就來(lái)學(xué)習(xí)一下如何通過(guò)使用一個(gè)Go包Singleflight來(lái)減少重復(fù)進(jìn)程,從而優(yōu)化Go代碼吧
    2023-09-09
  • 一文帶你了解Go語(yǔ)言中函數(shù)設(shè)計(jì)的實(shí)踐示例

    一文帶你了解Go語(yǔ)言中函數(shù)設(shè)計(jì)的實(shí)踐示例

    良好設(shè)計(jì)的函數(shù)具有清晰的職責(zé)和邏輯結(jié)構(gòu),提供準(zhǔn)確的命名和適當(dāng)?shù)膮?shù)控制,下面我們將一一描述函數(shù)設(shè)計(jì)時(shí)能夠遵循的最佳實(shí)踐,希望對(duì)大家有所幫助
    2023-06-06
  • Golang編程并發(fā)工具庫(kù)MapReduce使用實(shí)踐

    Golang編程并發(fā)工具庫(kù)MapReduce使用實(shí)踐

    這篇文章主要為大家介紹了Golang并發(fā)工具庫(kù)MapReduce的使用實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • go使用net/url包來(lái)解析URL提取主機(jī)部分

    go使用net/url包來(lái)解析URL提取主機(jī)部分

    這篇文章主要為大家介紹了go使用net/url包來(lái)解析URL提取主機(jī)部分實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Go 語(yǔ)言中的select語(yǔ)句詳解及工作原理

    Go 語(yǔ)言中的select語(yǔ)句詳解及工作原理

    在Go語(yǔ)言中,select語(yǔ)句是用于處理多個(gè)通道(channel)操作的一種控制結(jié)構(gòu),它類(lèi)似于 switch 語(yǔ)句,本文給大家介紹Go 語(yǔ)言中的select語(yǔ)句詳解及工作原理,感興趣的朋友一起看看吧
    2025-04-04

最新評(píng)論

邵武市| 天等县| 宜黄县| 仁化县| 离岛区| 托克逊县| 化德县| 淮南市| 阿瓦提县| 西乌| 白玉县| 临朐县| 石河子市| 荆州市| 洪湖市| 抚松县| 宜宾县| 巨鹿县| 上犹县| 子长县| 河间市| 丹棱县| 陆河县| 古浪县| 儋州市| 夏邑县| 田阳县| 集安市| 梅河口市| 永靖县| 谢通门县| 二手房| 大同县| 太湖县| 扬中市| 塔河县| 柳林县| 辛集市| 昌江| 旬阳县| 甘谷县|