国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

聊聊Go 語言的錯誤處理

開發 后端
在 go 語言中,有一個預定義的接口:error,該接口自帶一個 Error() 方法,調用該方法會返回一個字符串。

[[396764]]

構造 error

在 go 語言中,有一個預定義的接口:error,該接口自帶一個 Error() 方法,調用該方法會返回一個字符串。

  1. type error interface { 
  2.   Error() string 

調用該方法,會返回當前錯誤的具體結果。一般有下面幾種方式生成 error。

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

errors.New()

調用 errors.New() 會返回一個 error 類型的結構體,該結構體內部會實現一個 Error() 方法, 調用該方法返回的結果為調用 errors.New() 方法時傳入的內容。

  1. import ( 
  2.  "errors" 
  3.  "fmt" 
  4.  
  5. func divide(a, b int) (error, int) { 
  6.  if b == 0 { 
  7.     // 被除數為0,則構造一個 error 結構體 
  8.   return errors.New("被除數不能為0"), 0 
  9.  } 
  10.  var result = a / b 
  11.  return nil, result 
  12.  
  13. func main() { 
  14.  var err error // error 類型數據的初始值為 nil,類似于 js 中的 null 
  15.  var result int 
  16.  
  17.  err, result = divide(1, 0) 
  18.  
  19.   if err == nil { 
  20.     // 如果 err 為 nil,說明運行正常 
  21.     fmt.Println("計算結果", result) 
  22.   } else { 
  23.     // 如果 err 不為 nil,說明運行出錯 
  24.     // 調用 error 結構體的 Error 方法,輸出錯誤原因 
  25.     fmt.Println("計算出錯", err.Error()) 
  26.   } 

可以看到,上面的代碼中,由于調用 divide 除法方法時,由于傳入的被除數為 0。經過判斷,會拋出一個由 errors.New 構造的 error 類型的結構體。

我們將調用 error.Error() 方法返回的結果輸出到控制臺,可以發現其返回的結果,就是傳入 New 方法的值。

執行結果如下:

fmt.Errorf()

通過 fmt.Errorf() 方法構造的 error 結構體,與調用 errors.New() 方法的結果類似。不同的是,fmt.Errorf() 方法會進行一次數據的格式化。

  1. func divide(a, b int) (error, int) { 
  2.  if b == 0 { 
  3.     // 將參數進行一次格式化,格式化后的字符串放入 error 中 
  4.   return fmt.Errorf("數據 %d 不合法", b), 0 
  5.  } 
  6.  var result = a / b 
  7.  return nil, result 
  8.  
  9. err, result := divide(1, 0) 
  10. fmt.Println("計算出錯", err.Error()) 

執行結果如下:

panic() 與 recover()

panic()

panic() 相當于主動停止程序運行,調用時 panic() 時,需要傳入中斷原因。調用后,會在控制臺輸出中斷原因,以及中斷時的調用堆棧。我們可以改造一下之前的代碼:

  1. func divide(a, b int) (error, int) { 
  2.  if b == 0 { 
  3.     // 如果程序出錯,直接停止運行 
  4.   panic("被除數不能為0"
  5.  } 
  6.  var result = a / b 
  7.  return nil, result 
  8.  
  9. func main() { 
  10.   err, result := divide(1, 0) 
  11.   fmt.Println("計算出錯", err.Error()) 

在運行到 panic() 處,程序直接中斷,并在控制臺打印出了中斷原因。

panic() 可以理解為,js 程序中的 throw new Error() 的操作。那么,在 go 中有沒有辦法終止 panic() ,也就是類似于 try-catch 的操作,讓程序回到正常的運行邏輯中呢?

recover()

在介紹 recover() 方法之前,還需要介紹一個 go 語言中的另一個關鍵字:defer。

defer 后的語句會在函數進行 return 操作之前調用,常用于資源釋放、錯誤捕獲、日志輸出。

  1. func getData(table, sql) { 
  2.   defer 中斷連接() 
  3.   db := 建立連接(table
  4.   data := db.select(sql) 
  5.   return data 

defer 后的語句會被存儲在一個類似于棧的數據結構內,在函數結束的時候,被定義的語句按順序出棧,越后面定義的語句越先被調用。

  1. func divide(a, b intint { 
  2.   defer fmt.Println("除數為", b) 
  3.   defer fmt.Println("被除數為", a) 
  4.  
  5.   result := a / b 
  6.   fmt.Println("計算結果為", result) 
  7.  return result 
  8.  
  9. divide(10, 2) 

上面的代碼中,我們在函數開始運行的時候,先通過 defer 定義了兩個輸出語句,先輸出除數,后輸出被除數。

實際的運行結果是:

  • 先輸出計算結果;
  • 然后輸出被除數;
  • 最后輸出除數;

這和前面提到的,通過 defer 定義的語句會在函數結束的時候,按照出棧的方式進行執行,先定義的后執行。defer 除了會在函數結束的時候執行,出現異常的的時候也會先走 defer 的邏輯,也就是說,我們在調用了 panic() 方法后,程序中斷過程中,也會先將 defer 內的語句運行一遍。

這里我們重新定義之前的 divide 函數,在執行之前加上一個 defer 語句,defer 后面為一個自執行函數,該函數內會調用 recover() 方法。

recover() 方法調用后,會捕獲到當前的 panic() 拋出的異常,并進行返回,如果沒有異常,則返回 nil。

  1. func divide(a, b intint { 
  2.   // 中斷之前,調用 defer 后定義的語句 
  3.  defer func() { 
  4.   if err := recover(); err != nil { 
  5.    fmt.Println("捕獲錯誤", err) 
  6.   } 
  7.  }() 
  8.  
  9.  if b == 0 { 
  10.     // 函數運行被中斷 
  11.   panic("被除數不能為0"
  12.   return 0 
  13.  } 
  14.  
  15.  return a / b 
  16.  
  17. result := divide(1, 0) 
  18. fmt.Println("計算結果", result) 

上面的代碼運行后,我們發現之前調用 panic() 中斷的程序被恢復了,而且后面的計算結果也正常進行輸出了。

這就有點類似于 try-catch 的邏輯了,只是 recover 需要放在 defer 關鍵詞后的語句中,更像是 catch 和 finally 的結合。

本文轉載自微信公眾號「自然醒的筆記本」,可以通過以下二維碼關注。轉載本文請聯系自然醒的筆記本公眾號。

 

責任編輯:武曉燕 來源: 自然醒的筆記本
相關推薦

2014-11-17 10:05:12

Go語言

2021-04-14 07:08:14

Nodejs錯誤處理

2025-03-31 00:29:44

2021-09-13 07:53:31

Go錯誤處理

2025-06-06 06:45:54

2022-09-05 08:55:15

Go2提案語法

2025-09-05 01:55:00

Go并發錯誤項目

2025-06-30 09:49:11

2020-12-17 06:25:05

Gopanic 模式

2023-10-26 15:49:53

Go日志

2021-09-27 15:33:48

Go 開發技術

2021-09-27 23:28:29

Go多協程并發

2021-09-27 10:04:03

Go程序處理

2017-09-22 15:25:40

Go語言其他語言錯誤處理

2023-03-10 08:48:29

2024-03-27 08:18:02

Spring映射HTML

2024-02-28 08:54:57

switchGo錯誤

2022-06-26 23:03:14

Go標準庫語言

2022-07-13 08:53:28

函數Go語言

2025-02-24 09:30:15

點贊
收藏

51CTO技術棧公眾號

美女91精品| 99视频在线观看地址| 亚洲第一二区| 欧美三级欧美一级| 国产欧美高清在线| 亚洲福利国产| 91精品国产免费久久久久久| 97久久人人超碰caoprom| 五月婷婷久久丁香| 男女午夜激情视频| 免费成人在线网站| 国产v亚洲v天堂无码| 亚洲欧美日本国产| 国产视频精品va久久久久久| a黄色在线观看| 亚洲日穴在线视频| 欧美三级一级片| 激情综合色综合久久| 2014亚洲精品| 免费久久精品| 久久久久国产一区二区三区| 97天天综合网| 91精品午夜视频| 国产高清一区在线观看| 亚洲人成7777| 黄色三级视频片| 26uuu精品一区二区在线观看| 久久久神马电影| 中文字幕一区二区三区欧美日韩 | 欧美性xxx| 欧美日韩视频在线观看一区二区三区| 99视频资源网| 国产欧美中文在线| 日韩国产欧美亚洲| 国产精品99久久久久| 亚洲永久一区二区三区在线| 欧美日韩国产高清| 成人免费在线视频网址| 国内精品久久久久久久久电影网| 欧美黑人巨大xxx极品| 久久亚洲国产精品尤物| 亚洲天堂视频在线观看| av剧情在线观看| 亚洲成人精品久久| 国产剧情av在线播放| 亚洲第一精品夜夜躁人人躁| 性欧美videos高清hd4k| 日韩一区二区三区视频在线| 嫩草香蕉在线91一二三区| 欧美日韩国产经典色站一区二区三区| 国产私人尤物无码不卡| 色哟哟精品一区| 国产在线色视频| 欧美老女人第四色| 久久久久久久久免费视频| 91精品国产91久久综合桃花| 成人在线观看亚洲| 精品少妇一区二区三区| 国产污视频在线播放| 国产一区二区av| 图片一区二区| 欧美亚洲伦理www| 亚洲欧美精品中文字幕在线| 调教一区二区| 日韩精品中文字幕有码专区| 欧美电影免费观看高清完整| 美日韩丰满少妇在线观看| 久久99国产精品久久99大师| 国产精品一二三视频| 欧美成人日韩| 欧美一区1区三区3区公司| 韩国av一区二区| 成人免费观看视频在线观看| 亚洲视频免费在线观看| 九色视频网站在线观看| 精品国产三级电影在线观看| 男人天堂久久| 国产精品视频一区国模私拍| 一区二区毛片| 亚洲熟妇无码一区二区三区| 一区二区三区中文字幕精品精品 | 99www免费人成精品| 麻豆tv免费在线观看| 欧美mv日韩mv国产网站app| 快播电影网址老女人久久| 欧美性在线观看| 1024日韩| 色七七在线观看| 欧美日韩在线免费视频| 亚洲伊人精品酒店| 成人黄色在线观看| 国产精品小仙女| 成人频在线观看| 国产视频亚洲精品| 成人看的羞羞网站| 国产又爽又黄ai换脸| 亚洲主播在线观看| 免费观看欧美大片| 91免费的视频在线播放| 成人精品鲁一区一区二区| 在线麻豆国产传媒1国产免费| 亚洲国产精品一区二区久| 五月天亚洲一区| 亚洲无玛一区| 亚洲宅男天堂在线观看无病毒| 男人av在线播放| 国产欧美中文字幕| 懂色av中文一区二区三区| 久久免费看视频| 操日韩av在线电影| 免费在线观看视频一区| 在线观看av影片| 欧美成人sm免费视频| 爽好久久久欧美精品| 中文字幕一区二区三区域| 精品欧美一区二区在线观看 | 亚洲аv电影天堂网| 日韩激情网站| 99视频精品全部免费看| 欧美视频在线观看 亚洲欧| 精品国产三区在线| 蜜桃狠狠色伊人亚洲综合网站| 中文一区二区完整视频在线观看| 97人澡人人添人人爽欧美| 国产中文字幕亚洲| 国产亚洲精久久久久久| 中文字幕在线视频网站| 国产成人精品一区二区三区福利| 国产精品理论在线观看| 涩涩涩在线视频| 国产视频精品网| 午夜伦欧美伦电影理论片| 精品国产一区二区三区2021| 午夜精品一区二区在线观看| 欧美影院一区二区三区| 欧美女优在线视频| 欧美激情国产精品日韩| 日韩精品小视频| 日日欢夜夜爽一区| 国产最新视频在线观看| 国产成人中文字幕| 亚洲欧美色图小说| 97久久精品| 乱子伦视频在线看| 久久视频国产精品免费视频在线| 精品在线一区二区| а√天堂8资源在线官网| 国产精品免费一区二区三区观看| 亚洲欧美日韩在线不卡| 国产香蕉精品| 亚洲乱码国产一区三区| 美女av一区二区三区| 成人福利电影精品一区二区在线观看| √天堂8资源中文在线| 亚洲视频在线二区| 亚洲国产精品小视频| 久久国产福利国产秒拍| 爱看av在线| 最新不卡av| 在线一区二区日韩| 99久久99久久精品国产片果冻 | 国产精品美女无圣光视频| 亚洲四区在线观看| 欧美大胆视频| 免费的很黄很污的视频网站| 91av中文字幕| 亚洲综合色区另类av| 日韩国产综合| 日本福利在线观看| 国产三区二区一区久久| 日韩欧美国产电影| 久久国产综合精品| 国产精品高潮久久| 国产日韩成人内射视频 | 欧美大片va欧美在线播放| 97精品国产露脸对白| 成人免费观看49www在线观看| 欧美日韩激情四射| 久久精品亚洲94久久精品| 中文字幕一区二区三区不卡| 欧美日韩123| 秋霞在线一区二区| 久久天天躁狠狠躁夜夜躁2014| 国产色综合久久| 国内精品久久久久久久久电影网| 五丁香在线视频| 日韩中文一区| 日韩视频一区在线| 亚洲午夜久久久久久久久电影网| 黄色av免费在线| 99热这里只有精品免费| 欧美激情视频网站| 欧美性xxxx极品高清hd直播| 欧美在线免费一级片| 乱插在线www| 亚洲欧美久久久久| 亚洲一区二区三区四区在线播放| 精品福利二区三区| 日韩一区中文字幕| 亚洲深夜激情|