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

Go語言錯誤處理異常捕獲+異常拋出

 更新時間:2022年02月25日 16:07:39   作者:酷爾。  
這篇文章主要介紹了Go語言錯誤處理異常捕獲和異常拋出,Go語言的作者認(rèn)為java等語言的錯誤處理底層實(shí)現(xiàn)較為復(fù)雜,就實(shí)現(xiàn)了函數(shù)可以返回錯誤類型以及簡單的異常捕獲,雖然簡單但是也非常精妙,大大的提高了運(yùn)行效率,下文需要的朋友可以參考一下

前言:

Go 語言追求簡潔優(yōu)雅,所以,Go 語言不支持傳統(tǒng)的 try…catch…finally 這種處理。
Go 中引入的錯誤處理方式為:defer, panic, recover,也僅僅是錯處處理的模擬
Go語言的作者認(rèn)為java等語言的錯誤處理底層實(shí)現(xiàn)較為復(fù)雜,就實(shí)現(xiàn)了函數(shù)可以返回錯誤類型以及
簡單的異常捕獲,雖然簡單但是也非常精妙,大大的提高了運(yùn)行效率。

一、error變量可以做什么

1.定義一個error變量

①直接new一個

err := errors.New("我是錯誤處理語句")

②實(shí)現(xiàn)Error接口

只要實(shí)現(xiàn)了Error接口就可以被error類型所接收,打印的時候會直接打印實(shí)現(xiàn)接口時,方法返回的字符串。

官方接口如下:

type error interface {
? ? Error() string
}

代碼如下:

//定義一個結(jié)構(gòu)體
type man struct {
?? ?age int
}
//實(shí)現(xiàn)接口
func (a man) Error() string {
?? ?str := "這是一個錯誤接口"
?? ?return str
}
//創(chuàng)建函數(shù)返回錯誤類型
func judgeAge() (int, error) {
?? ?var a man
?? ?return 0, a
}
//主函數(shù)調(diào)用
func main() {
?? ?_, e := judgeAge()
?? ?if e!=nil{
?? ??? ?fmt.Println(e)
?? ?}
}

2.錯誤的處理

    將如果錯誤變量不為空,則將錯誤進(jìn)行捕獲打印,這里直接打印到了控制臺,可以將錯誤打印到日志文件內(nèi),為以后系統(tǒng)的維護(hù)做保障。

代碼如下:

package main

import (
?? ?"errors"
?? ?"fmt"
)

func main() {
?? ?err := errors.New("我是錯誤處理語句")
?? ?if err != nil {
?? ??? ?fmt.Println(err)
?? ?}else {
?? ??? ?fmt.Println("沒有錯誤")
?? ?}
?? ?fmt.Println(123)
}

3.做函數(shù)返回值

  • 如果函數(shù)返回的錯誤類型值不為空,則將其進(jìn)行打印

代碼如下:

package main

import (
?? ?"errors"
?? ?"fmt"
)

func test(num1,num2 int) error {
?? ?if num2 == 0 {
?? ??? ?return errors.New("除數(shù)為零")
?? ?}
?? ?res := num1 / num2
?? ?fmt.Println("計(jì)算結(jié)果為=", res)
?? ?return nil

}
func main() {
?? ?err := test(11,0)
?? ?if err!=nil{
?? ??? ?fmt.Println(err)
?? ?}
}

4.做函數(shù)參數(shù)

一般用作處理錯誤變量,在需要進(jìn)行錯誤檢驗(yàn)的時候調(diào)用函數(shù),不用再進(jìn)行判斷了

代碼如下:

func PrintError(err error){
?? ?if err!=nil{
?? ??? ?fmt.Println(err)
?? ?}
}

二、模擬異常的捕獲與拋出

1.defer簡介

 defer后面定義的東西是在調(diào)用函數(shù)執(zhí)行完的時候執(zhí)行的代碼,一般用于文件描述符、數(shù)據(jù)庫對象的關(guān)閉(在之前講管道的時候有介紹過)

 defer什么什么延時執(zhí)行

代碼如下:

func pDefer() {
?? ?defer fmt.Println("hahaha")
?? ?fmt.Println("hello")
}
func main() {
?? ?pDefer()
}
/*
打印結(jié)果
?? ?hello
?? ?hahaha
*/

2.使用recover模擬異常的捕獲

代碼如下:

package main

import (
?? ?"fmt"
)

func test() {
?? ?//使用defer + recover 來捕獲和處理異常(返回錯誤變量)
?? ?//函數(shù)執(zhí)行末尾執(zhí)行這個匿名函數(shù)
?? ? defer func() {
?? ? ?? ?err := recover() // recover()內(nèi)置函數(shù),可以捕獲到異常
?? ? ?? ?if err != nil { ?//說明捕獲到錯誤
?? ? ?? ??? ?fmt.Println(err)
?? ? ?? ?}
?? ? }()
?? ?num1 := 10
?? ?num2 := 0
?? ?res := num1 / num2
?? ?fmt.Println("計(jì)算結(jié)果為=", res)

}
func main() {
?? ?test()
}

3.使用panic主動拋出錯誤

異常的捕獲,使程序還能夠正常的運(yùn)行,如果有致命錯誤就需要進(jìn)行錯誤的拋出了,也就是宕機(jī),不到迫不得已千萬不要使用這個函數(shù),有可能會造成大量數(shù)據(jù)的丟失

代碼如下:

package main

import (
?? ?"errors"
?? ?"fmt"
)

func test() error {
?? ?num1 := 10
?? ?num2 := 0
?? ?if num2 == 0 {
?? ??? ?return errors.New("除數(shù)為零")
?? ?}
?? ?res := num1 / num2
?? ?fmt.Println("計(jì)算結(jié)果為=", res)
?? ?return nil

}


func main() {
?? ?//無論err是否為空,都進(jìn)行程序的終止
?? ? panic(test())//內(nèi)置函數(shù)2,參數(shù)使一個interface接口
}

運(yùn)行結(jié)果:

總結(jié):

Go語言雖然沒有一個較為成熟的異常捕獲機(jī)制,但是其精簡的錯誤處理仍舊能夠滿足其需求,減少錯誤的處理大大的加快了我們的開發(fā)效率,代碼的運(yùn)行效率。

到此這篇關(guān)于Go語言錯誤處理異常捕獲+異常拋出的文章就介紹到這了,更多相關(guān)Go語言異常捕獲和異常拋出內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Makefile構(gòu)建Golang項(xiàng)目示例詳解

    Makefile構(gòu)建Golang項(xiàng)目示例詳解

    這篇文章主要為大家介紹了Makefile構(gòu)建Golang項(xiàng)目的過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • golang切片擴(kuò)容規(guī)則實(shí)現(xiàn)

    golang切片擴(kuò)容規(guī)則實(shí)現(xiàn)

    這篇文章主要介紹了golang切片擴(kuò)容規(guī)則實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • go內(nèi)存緩存如何new一個bigcache對象示例詳解

    go內(nèi)存緩存如何new一個bigcache對象示例詳解

    這篇文章主要為大家介紹了go內(nèi)存緩存如何new一個bigcache對象示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Golang中interface的基本用法詳解

    Golang中interface的基本用法詳解

    Go 中接口也是一個使用得非常頻繁的特性,好的軟件設(shè)計(jì)往往離不開接口的使用,比如依賴倒置原則(通過抽象出接口,分離了具體實(shí)現(xiàn)與實(shí)際使用的耦合)。 今天,就讓我們來了解一下 Go 中接口的一些基本用法
    2023-01-01
  • 詳解Go函數(shù)和方法之間有什么區(qū)別

    詳解Go函數(shù)和方法之間有什么區(qū)別

    這篇文章就簡單和大家聊一聊在Go中函數(shù)與方法之間的區(qū)別,文章通過代碼示例介紹的非常詳細(xì),對我們的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴跟著小編一起來看看吧
    2023-07-07
  • Go批量操作excel導(dǎo)入到mongodb的技巧

    Go批量操作excel導(dǎo)入到mongodb的技巧

    這篇文章主要介紹了Go批量操作excel導(dǎo)入到mongo,包括選擇命令行包,讀取配置連接數(shù)據(jù)庫的方法,本文示例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • Go1.21新增slices包中函數(shù)的用法詳解

    Go1.21新增slices包中函數(shù)的用法詳解

    Go?1.21新增的?slices?包提供了很多和切片相關(guān)的函數(shù),可以用于任何類型的切片,本文為大家整理了部分函數(shù)的具體用法,感興趣的小伙伴可以了解一下
    2023-08-08
  • 詳解Golang中interface接口的原理和使用技巧

    詳解Golang中interface接口的原理和使用技巧

    interface?接口在?Go?語言里面的地位非常重要,是一個非常重要的數(shù)據(jù)結(jié)構(gòu)。本文主要介紹了Golang中interface接口的原理和使用技巧,希望對大家有所幫助
    2022-11-11
  • GO語言不固定參數(shù)函數(shù)與匿名函數(shù)的使用

    GO語言不固定參數(shù)函數(shù)與匿名函數(shù)的使用

    本文主要介紹了GO語言不固定參數(shù)函數(shù)與匿名函數(shù)的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • RabbitMq如何做到消息的可靠性投遞

    RabbitMq如何做到消息的可靠性投遞

    現(xiàn)在的一些互聯(lián)網(wǎng)項(xiàng)目或者是高并發(fā)的項(xiàng)目中很少有沒有引入消息隊(duì)列的。 引入消息隊(duì)列可以給這個項(xiàng)目帶來很多的好處,這篇文章主要為大家介紹了RabbitMq如何做到消息的可靠性投遞,有需要的朋友可以借鑒參考下
    2022-12-12

最新評論