欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang中的錯誤處理的示例詳解

 更新時間:2022年12月14日 09:36:25   作者:夢想畫家  
這篇文章主要為大家詳細介紹了Golang中的錯誤處理的相關資料,文章中的示例代碼講解詳細,對我們學習Golang有一定幫助,需要的可以參考一下

本文介紹Golang錯誤處理機制,包括不同類型錯誤處理、定義運行時錯誤等內容。

golang錯誤處理機制

Go錯誤處理類似C語言,沒有提供任何異常,以及類java語言使用的try/catch異常處理機制。go異常處理僅簡化為預定義的Error類型,Go沒有提供異常處理機制,不能拋出類似許多其他語言的異常。相反,Golang集成了新的錯誤處理機制,如panic 和 recovery。

error類型

error類型僅包括Error方法,返回string類型標識具體的錯誤信息。代碼如下:

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

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

示例

下面先看一個錯誤處理示例:

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

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

Go中很多函數(shù)返回多個值,通常其中一個返回值是錯誤類型。舉例: strconv.Atoi(),轉換字符串數(shù)據(jù)為數(shù)值類型,返回兩個值,第一個是轉換結果,第二個是錯誤。如果正常轉換,第二個返回值為nil。反之轉換失敗,可從錯誤中獲得錯誤原因。

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

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())
	}
}

如果有錯誤顯示錯誤信息,反之輸出結果。

創(chuàng)建錯誤對象

內置方法

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

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

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

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())
	}
}

第三方庫

有時需要在錯誤對象上增加額外信息:

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

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

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)

但內置功能相對較少,建議直接使用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內置函數(shù),類似其他語言的異常。當運行時出現(xiàn)該函數(shù),則程序在該點終止。

聲明panic

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

func panic( interface{} )

可以傳入字符串或其他類型參數(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")
    }

內置操作

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)
}

上面代碼因為除數(shù)為0,程序終止并報錯:panic: runtime error: integer divide by zero

另外方法slice時,索引超出范圍時也會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
}

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

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

panic與defer

還是從示例開始吧:

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")
}

輸出結果為:

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

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

recover

前面我們看了error和panic兩類異常,前者類似java中的運行時異常,后者類似于非運行時異常。error我們可以捕獲或忽略,但panic要么終止運行,要么手動恢復,也就是手動處理這類錯誤,如給用戶提示。下面同時示例來說明:

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)
	}
}

輸出結果:

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

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

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

相關文章

  • Go語言實戰(zhàn)學習之流程控制詳解

    Go語言實戰(zhàn)學習之流程控制詳解

    這篇文章主要為大家詳細介紹了Go語言中的流程控制,文中的示例代碼講解詳細,對我們學習Go語言有一定的幫助?,需要的朋友可以參考下
    2022-08-08
  • golang 數(shù)組隨機排序的實現(xiàn)

    golang 數(shù)組隨機排序的實現(xiàn)

    本文主要介紹了golang 數(shù)組隨機排序的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Golang中 Slice的分析與使用源碼解析

    Golang中 Slice的分析與使用源碼解析

    這篇文章主要介紹了Golang 中 Slice的分析與使用(含源碼),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • 在go中進行單元測試的案例分享

    在go中進行單元測試的案例分享

    這篇文章主要介紹了使用Go進行單元測試的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-01-01
  • golang中cache組件的使用及groupcache源碼解析

    golang中cache組件的使用及groupcache源碼解析

    本篇主要解析groupcache源碼中的關鍵部分, lru的定義以及如何做到同一個key只加載一次。緩存填充以及加載抑制的實現(xiàn)方法,本文重點給大家介紹golang中cache組件的使用及groupcache源碼解析,感興趣的朋友一起看看吧
    2021-06-06
  • GO excelize讀取excel進行時間類型轉換的示例代碼(自動轉換)

    GO excelize讀取excel進行時間類型轉換的示例代碼(自動轉換)

    我們經常會遇到如何自動識別excel中的時間類型數(shù)據(jù)并轉化成對應的 "Y-m-d H:i:s"類型數(shù)據(jù),本文小編給大家介紹了GO excelize讀取excel進行時間類型轉換的示例代碼(自動轉換),需要的朋友可以參考下
    2024-10-10
  • Golang?int函數(shù)使用實例全面教程

    Golang?int函數(shù)使用實例全面教程

    這篇文章主要為大家介紹了Golang?int函數(shù)使用實例全面教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Go實現(xiàn)set類型的示例代碼

    Go實現(xiàn)set類型的示例代碼

    本文主要介紹了Go實現(xiàn)set類型的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • Go語言基礎設計模式之策略模式示例詳解

    Go語言基礎設計模式之策略模式示例詳解

    這篇文章主要為大家介紹了Go語言基礎設計模式之策略模式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2021-11-11
  • Go?對多個網(wǎng)絡命令空間中的端口進行監(jiān)聽的解決方案

    Go?對多個網(wǎng)絡命令空間中的端口進行監(jiān)聽的解決方案

    這篇文章主要介紹了Go?如何對多個網(wǎng)絡命令空間中的端口進行監(jiān)聽,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2024-07-07

最新評論