網(wǎng)站首頁 編程語言 正文
一、Golang 錯誤是什么?
對于Go語言(Golang)的錯誤是通過返回值的方式,來強(qiáng)迫調(diào)用者對錯誤進(jìn)行處理,要么你通過 _ 忽略,要么你處理。對于這種設(shè)計方式,我們通常需要會寫大量的 if err != nil 判斷。我們可以通過方法來做到校驗。
這類代碼非常的多,盡管工程中 error 大部分都是nil,也就是沒有任何錯誤,但是非nil的時候,就意味著錯誤就出現(xiàn)了。
在Go語言中,使用多值返回來返回錯誤。Go中可以拋出一個 panic 的異常,然后在 defe r中通過 recover 捕獲這個異常,然后再正常處理。
二、錯誤校驗
1.方法
當(dāng)存在錯誤時,我們通過方法來判斷是否 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.方法
當(dāng)存在錯誤時,我們通過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() { ?? ?// 當(dāng)使用defer 時,將會在程序內(nèi)方法結(jié)算后, ?? ?// 依照后進(jìn)先出的方法執(zhí)行defer內(nèi)方法 ?? ?// 此時就能保證 捕獲程序一定能捕獲到錯誤 ?? ?defer RecoverError() ?? ?for _, c := range []string{"1", "2"} { ?? ??? ?atoi, err := strconv.Atoi(c) ?? ??? ?Panic(err) ?? ??? ?fmt.Println(atoi) ?? ?} }
總結(jié)
通過以上來簡單熟悉Golang 與其他語言截然不同的錯誤處理形式,由于其他語言開發(fā)者經(jīng)常將異常與控制結(jié)構(gòu)混在一起,這會很容易使得代碼變得混亂。開發(fā)者也很容易濫用異常,甚至一個小小的錯誤都拋出一個異常。這在Golang中不被允許,Go語言也就不支持傳統(tǒng)的 try…catch…finally 這種異常,通過新的 defer panic recover 來進(jìn)行錯誤處理。
原文鏈接:https://blog.csdn.net/moer0/article/details/123593492
相關(guān)推薦
- 2023-01-17 Golang時間及時間戳的獲取轉(zhuǎn)換超全面詳細(xì)講解_Golang
- 2022-09-21 Python機(jī)器學(xué)習(xí)庫scikit-learn入門開發(fā)示例_python
- 2022-11-01 C++中的pair使用詳解_C 語言
- 2023-04-08 React中的useEffect?useLayoutEffect到底怎么用_React
- 2022-09-25 linux系統(tǒng)下oracle數(shù)據(jù)庫的導(dǎo)入導(dǎo)出
- 2022-04-01 python+selenium對table表和分頁處理_python
- 2022-05-21 基于C++實現(xiàn)信息管理系統(tǒng)_C 語言
- 2022-07-10 初中級前端程序員必用且夠用的git命令同時推送到github/gitee及三種常用場景
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支