在 go 語(yǔ)言中,錯(cuò)誤處理通過(guò) errors 包實(shí)現(xiàn),主要包括創(chuàng)建、比較、提取和包裝錯(cuò)誤。1. 創(chuàng)建錯(cuò)誤使用 errors.new() 或 fmt.errorf(),前者適用于固定信息,后者用于動(dòng)態(tài)拼接;2. 錯(cuò)誤比較推薦使用 errors.is(),它支持遞歸檢查錯(cuò)誤鏈,也可用 == 比較簡(jiǎn)單判斷;3. 提取特定類型錯(cuò)誤使用 errors.as(),可在錯(cuò)誤鏈中查找目標(biāo)類型;4. 錯(cuò)誤包裝通過(guò) fmt.errorf 結(jié)合 %w 實(shí)現(xiàn),保留原始錯(cuò)誤信息,可用 errors.unwrap() 手動(dòng)解包,但更推薦直接配合 errors.is() 或 errors.as() 使用。
在 Go 語(yǔ)言中,錯(cuò)誤處理是一個(gè)非常核心的部分。標(biāo)準(zhǔn)庫(kù)中的
errors
errors.New()
fmt.Errorf
最常用的兩種方式是通過(guò)
errors.New()
fmt.Errorf()
errors.New("your error message")
這是最直接的方式,適合不需要格式化信息的場(chǎng)景。例如:
err := errors.New("something went wrong")
fmt.Errorf("error occurred: %v", err)
更加靈活,可以插入變量或拼接信息。注意,在 Go 1.13+ 中推薦加上
%w
err := fmt.Errorf("failed to read file: %w", os.ErrNotExist)
如果你只是想返回一個(gè)固定的錯(cuò)誤字符串,用 errors.New 就夠了;需要?jiǎng)討B(tài)拼接時(shí),優(yōu)先考慮 fmt.Errorf。
errors.Is()
==
當(dāng)我們需要判斷某個(gè)錯(cuò)誤是否是我們期望的那個(gè)時(shí),可以用到以下方法:
立即學(xué)習(xí)“go語(yǔ)言免費(fèi)學(xué)習(xí)筆記(深入)”;
==
直接比較兩個(gè)錯(cuò)誤是否相同。適用于簡(jiǎn)單的預(yù)定義錯(cuò)誤,比如:
if err == os.ErrNotExist { // 處理文件不存在的情況 }
errors.Is(err, target)
這是更推薦的做法,尤其當(dāng)你處理的是被包裝過(guò)的錯(cuò)誤(wrap)。這個(gè)函數(shù)會(huì)遞歸地檢查錯(cuò)誤鏈,直到找到匹配的目標(biāo)錯(cuò)誤為止。
注意:如果錯(cuò)誤是用
包裝過(guò)的,必須用fmt.Errorf(...%w...)登錄后復(fù)制才能正確識(shí)別原始錯(cuò)誤。errors.Is()登錄后復(fù)制
errors.As()
有時(shí)候我們需要從一個(gè)可能被包裝過(guò)的錯(cuò)誤中提取特定類型的錯(cuò)誤。這時(shí)候就要用到
errors.As()
var pathErr *fs.PathError if errors.As(err, &pathErr) { fmt.Println("File path error:", pathErr.Path) }
這段代碼的意思是:嘗試將
err
*fs.PathError
errors.As()
使用場(chǎng)景舉例:你調(diào)用了某個(gè)庫(kù)的方法,它返回了一個(gè)封裝后的錯(cuò)誤,你想從中提取出具體的系統(tǒng)錯(cuò)誤類型進(jìn)行處理。
Go 1.13 引入了錯(cuò)誤包裝機(jī)制,使得你可以把一個(gè)錯(cuò)誤包進(jìn)另一個(gè)里面,同時(shí)保留原始錯(cuò)誤信息。
使用 %w
err := fmt.Errorf("read failed: %w", io.ErrUnexpectedEOF)
解包錯(cuò)誤:errors.Unwrap()
cause := errors.Unwrap(err)
不過(guò)大多數(shù)情況下你并不需要自己去一層層拆包,而是直接用前面提到的
errors.Is()
errors.As()
基本上就這些。Go 的
errors
以上就是Golang中errors包有哪些常用方法 詳解Golang標(biāo)準(zhǔn)庫(kù)的錯(cuò)誤處理工具的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)