日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

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

作者:酷爾。 ? 更新時間: 2022-04-28 編程語言

前言:

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

一、error變量可以做什么

1.定義一個error變量

①直接new一個

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

②實現Error接口

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

官方接口如下:

type error interface {
? ? Error() string
}

代碼如下:

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

2.錯誤的處理

?? ?將如果錯誤變量不為空,則將錯誤進行捕獲打印,這里直接打印到了控制臺,可以將錯誤打印到日志文件內,為以后系統的維護做保障。

代碼如下:

package main

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

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

3.做函數返回值

  • 如果函數返回的錯誤類型值不為空,則將其進行打印

代碼如下:

package main

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

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

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

4.做函數參數

一般用作處理錯誤變量,在需要進行錯誤檢驗的時候調用函數,不用再進行判斷了

代碼如下:

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

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

1.defer簡介

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

?defer什么什么延時執行

代碼如下:

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

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

代碼如下:

package main

import (
?? ?"fmt"
)

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

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

3.使用panic主動拋出錯誤

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

代碼如下:

package main

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

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

}


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

運行結果:

總結:

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

原文鏈接:https://blog.csdn.net/apple_51931783/article/details/122573931

欄目分類
最近更新