久久国产乱子伦精品免费M,亚洲一区二区三区91,欧美国产在线视频,国产精品视频久久

Go 語言中的錯誤和異常處理

在 Go 語言中沒有與 Java 或者 .NET 類似的異常處理機制。Go 語言的開發者認為類似的異常處理已經被過多的使用了,這樣的異常機制過度依賴上層代碼對異常的處理,如果上層代碼對異常的處理不到位會使程序出一些不易排查的BUG。所以為了讓開發者能夠重視并正確的處理每一個可能會出現異常的函數,Go語言采用返回值的形式來返回錯誤。這一機制,既可以讓開發者真正理解錯誤處理的含義,也可以大大降低程序的復雜度。

 

1.error 接口

error 是系統自帶的一個接口類型的自定義類型。

代碼如下:

代碼塊
  • 1? type error interface {
  • 2? ? ? ? Error() string
  • 3? }

 

2. errors 包

Tips:包的概念會在后文的Go語言中的包管理中詳細介紹

errors 包中包含了一個實現了 error 這個接口的結構體類型 errorString。我們可以直接使用包中的方法來自定義一些錯誤,從而返回我們希望被上層代碼處理的錯誤信息。

代碼示例:

代碼塊
  • 1? package main
  • 2
  • 3? import (
  • 4? ? ? ? ? "errors"
  • 5? ? ? ? ? "fmt"
  • 6? )
  • 7
  • 8? func main() {
  • 9? ? ? ? ? t, err := divide(2, 0)
  • 10? ? ? ? if err != nil {
  • 11? ? ? ? ? ? ? ? fmt.Println(err)
  • 12? ? ? ? } else {
  • 13? ? ? ? ? ? ? ? fmt.Println(t)
  • 14? ? ? ? }
  • 15? }
  • 16
  • 17? func divide(a, b int) (int, error) {
  • 18? ? ? ? if b == 0 {
  • 19? ? ? ? ? ? ? ? return 0, errors.New("除數不能為0")
  • 20? ? ? ? }
  • 21? ? ? ? return a / b, nil
  • 22? }
  • 第 19 行:使用 errors.New 自定義一個除數不能為0的錯誤;
  • 第 10~12 行:若除數為零,則輸出這個錯誤。

執行結果:

image.png

 

3. 異常處理

如果你調用的方法的開發者不夠仔細,并沒有將所有的異常都考慮到并作為錯誤返回,那你的程序可能就會被其影響而崩潰。對這種情況,GO 語言提供了一個叫recover()的函數,用于處理這種問題。一般常用于服務啟動的入口函數,因為網絡等外部因素,極有可能會導致程序異常,這些異常就需要這個函數來捕獲。

代碼示例:

代碼塊
  • 1? package main
  • 2
  • 3? import (
  • 4? ? ? ? ? "fmt"
  • 5? )
  • 6
  • 7? func main() {
  • 8? ? ? ? ? defer func() {
  • 9? ? ? ? ? ? ? ? ? err := recover()
  • 10? ? ? ? ? ? ? ? if err != nil {
  • 11? ? ? ? ? ? ? ? ? ? ? ? fmt.Println("程序運行中出現異常:", err)
  • 12? ? ? ? ? ? ? ? }
  • 13? ? ? ? ? }()
  • 14? ? ? ? ? t := divide(2, 0)
  • 15? ? ? ? ? fmt.Println(t)
  • 16? }
  • 17
  • 18? func divide(a, b int) int {
  • 19? ? ? ? ? return a / b
  • 20? }
  • 第 17 行:在沒有判斷除數的情況下直接做除法,若除數為零,程序直接崩潰。
  • 第 8~11 行:在 main 函數結束時,獲取執行過程中的錯誤,若沒有錯誤者err為nil。

執行結果:

image.png

 

4. 小結

本位介紹了 Go 語言中如何使用?errors?來自定義錯誤,如何去使用函數中返回出來的?error 類型變量,來處理自定義錯誤以及在無法避免的異常出現的時候如何使用recover()來保障程序不崩潰。

文章來源于網絡,侵刪!

相關新聞

歷經多年發展,已成為國內好評如潮的Linux云計算運維、SRE、Devops、網絡安全、云原生、Go、Python開發專業人才培訓機構!

    1. 主站蜘蛛池模板: 麻江县| 黎城县| 枣强县| 蒙阴县| 鄂尔多斯市| 融水| 皋兰县| 丹阳市| 友谊县| 黄大仙区| 玛沁县| 武汉市| 慈溪市| 普安县| 沛县| 贡嘎县| 兰坪| 濉溪县| 巧家县| 石泉县| 西城区| 大港区| 平顶山市| 崇左市| 建平县| 漳浦县| 上蔡县| 大同市| 称多县| 海淀区| 延川县| 邯郸市| 高碑店市| 大安市| 游戏| 大姚县| 循化| 宣武区| 乌审旗| 诏安县| 彭泽县|