網(wǎng)站首頁 編程語言 正文
一、Golang 錯誤是什么?
對于Go語言(Golang)的錯誤是通過返回值的方式,來強迫調(diào)用者對錯誤進行處理,要么你通過 _ 忽略,要么你處理。對于這種設計方式,我們通常需要會寫大量的 if err != nil 判斷。我們可以通過方法來做到校驗。
這類代碼非常的多,盡管工程中 error 大部分都是nil,也就是沒有任何錯誤,但是非nil的時候,就意味著錯誤就出現(xiàn)了。
在Go語言中,使用多值返回來返回錯誤。Go中可以拋出一個 panic 的異常,然后在 defe r中通過 recover 捕獲這個異常,然后再正常處理。
二、錯誤校驗
1.方法
當存在錯誤時,我們通過方法來判斷是否 panic:
func Panic(err error) { ?? ?if err != nil { ?? ??? ?panic(err) ?? ?} }
2.判斷錯誤
代碼如下(示例):
若不采用方法
for _, c := range []string{"1", "2"} { ?? ??? ?atoi, err := strconv.Atoi(c) ?? ??? ?if err != nil { ?? ??? ??? ?return ?? ??? ?} ?? ??? ?fmt.Println(atoi) ?? ?}
若采用方法
但此時 panic 還需要我們額外處理來將錯誤捕獲
?? ?for _, c := range []string{"1", "2"} { ?? ??? ?atoi, err := strconv.Atoi(c) ?? ??? ?Panic(err) ?? ??? ?fmt.Println(atoi) ?? ?}
三、錯誤捕獲
1.方法
當存在錯誤時,我們通過recover來判斷 panic 是否產(chǎn)生:
func RecoverError() { ?? ?if err := recover(); err != nil { ?? ??? ?//輸出panic信息 ?? ??? ?fmt.Println(err) ?? ??? ?//輸出堆棧信息 ?? ??? ?fmt.Println(string(debug.Stack())) ?? ?} }
2.defer 的使用
由于我們的捕獲必須在錯誤產(chǎn)生之后,那我們就必須保證捕獲方法調(diào)用在錯誤處理方法之后,也就是通過 defer 來控制方法的最后調(diào)用 :
func main() { ?? ?// 當使用defer 時,將會在程序內(nèi)方法結算后, ?? ?// 依照后進先出的方法執(zhí)行defer內(nèi)方法 ?? ?// 此時就能保證 捕獲程序一定能捕獲到錯誤 ?? ?defer RecoverError() ?? ?for _, c := range []string{"1", "2"} { ?? ??? ?atoi, err := strconv.Atoi(c) ?? ??? ?Panic(err) ?? ??? ?fmt.Println(atoi) ?? ?} }
總結
通過以上來簡單熟悉Golang 與其他語言截然不同的錯誤處理形式,由于其他語言開發(fā)者經(jīng)常將異常與控制結構混在一起,這會很容易使得代碼變得混亂。開發(fā)者也很容易濫用異常,甚至一個小小的錯誤都拋出一個異常。這在Golang中不被允許,Go語言也就不支持傳統(tǒng)的 try…catch…finally 這種異常,通過新的 defer panic recover 來進行錯誤處理。
原文鏈接:https://blog.csdn.net/moer0/article/details/123593492
相關推薦
- 2023-01-04 Opencv實現(xiàn)計算兩條直線或線段角度方法詳解_python
- 2022-10-29 C語言實現(xiàn)單元測試的示例詳解_C 語言
- 2022-11-09 Android性能優(yōu)化之plt?hook與native線程監(jiān)控詳解_Android
- 2022-04-20 python數(shù)據(jù)類型中的字符串你了解多少_python
- 2023-01-15 c++矩陣計算性能對比:Eigen和GPU解讀_C 語言
- 2022-12-03 .Net?Core和RabbitMQ限制循環(huán)消費的方法_實用技巧
- 2022-11-24 Python模板的使用詳細講解_python
- 2022-11-14 Python實現(xiàn)簡易超市管理系統(tǒng)_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支