目錄
1. 實現error接口的自定義結構體
2. 使用類型斷言識別錯誤類型
3. 預定義錯誤變量(簡單場景)
4. 包裝錯誤並保留原始類型(Go 1.13 )
5. 枚舉式錯誤類型(帶代碼)
最佳實踐總結
首頁 後端開發 Golang 以示例為例自定義錯誤類型

以示例為例自定義錯誤類型

Jul 28, 2025 am 04:20 AM

自定義錯誤類型通過實現error接口提供richer 信息,如ValidationError結構體攜帶字段和消息;2. 使用errors.As可安全提取具體錯誤類型以進行針對性處理;3. 預定義錯誤變量適用於無上下文的狀態錯誤,通過errors.Is判斷相等性;4. 用%w包裝錯誤可保留原始類型和堆棧,便於透傳分析;5. 枚舉式APIError可攜帶錯誤碼,支持類型斷言獲取細節;最佳實踐包括返回指針、避免字符串比較、優先使用errors.As和errors.Is。

go by example custom error types

在Go 語言中,自定義錯誤類型是一種常見且推薦的做法,尤其是在構建庫或大型應用時。它能提供更豐富的錯誤信息、更好的可讀性和更強的類型控制。下面通過幾個典型的例子,展示如何使用custom error types

go by example custom error types

1. 實現error接口的自定義結構體

最常見的方式是定義一個結構體,並實現Error()方法。

 package main

import "fmt"

// 自定義錯誤類型type ValidationError struct {
    Field string
    Message string
}

// 實現error 接口func (e *ValidationError) Error() string {
    return fmt.Sprintf("validation error on field %q: %s", e.Field, e.Message)
}

// 示例函數,返回自定義錯誤func validateAge(age int) error {
    if age < 0 {
        return &ValidationError{Field: "age", Message: "age cannot be negative"}
    }
    if age > 150 {
        return &ValidationError{Field: "age", Message: "age is unrealistically high"}
    }
    return nil
}

func main() {
    err := validateAge(-5)
    if err != nil {
        fmt.Println(err) // 輸出: validation error on field "age": age cannot be negative
    }
}

✅ 優點:攜帶上下文信息(字段名、原因等)
✅ 建議:返回指針,避免值拷貝和比較問題

go by example custom error types

2. 使用類型斷言識別錯誤類型

當你需要根據錯誤類型做不同處理時,可以使用類型斷言或errors.As

 func main() {
    err := validateAge(-1)
    if err != nil {
        var ve *ValidationError
        if errors.As(err, &ve) {
            fmt.Printf("特定處理: 出錯字段是%s\n", ve.Field)
        } else {
            fmt.Println("未知錯誤:", err)
        }
    }
}

? errors.As()是Go 1.13 推薦方式,能穿透錯誤包裝(如fmt.Errorf("wrap: %w", err)

go by example custom error types

3. 預定義錯誤變量(簡單場景)

對於不需要攜帶數據的錯誤,可以直接定義全局錯誤變量。

 var (
    ErrNotFound = errors.New("resource not found")
    ErrAlreadyExists = errors.New("resource already exists")
)

func findUser(id string) (*User, error) {
    if id == "" {
        return nil, ErrNotFound
    }
    // ...
}

✅ 適合狀態類錯誤,可用errors.Is(err, ErrNotFound)判斷


4. 包裝錯誤並保留原始類型(Go 1.13 )

使用%w包裝錯誤,同時保留原始錯誤類型信息。

 func readFile(filename string) error {
    data, err := os.ReadFile(filename)
    if err != nil {
        return fmt.Errorf("failed to read config file %s: %w", filename, err)
    }
    // ...
}

func main() {
    err := readFile("config.json")
    if err != nil {
        // 可以檢查底層是否是os.PathError
        var pathErr *os.PathError
        if errors.As(err, &pathErr) {
            fmt.Println("路徑錯誤:", pathErr.Path)
        }
    }
}

5. 枚舉式錯誤類型(帶代碼)

有時你想返回帶錯誤碼的錯誤。

 type APIError struct {
    Code int
    Message string
}

func (e *APIError) Error() string {
    return e.Message
}

var (
    ErrInternal = &APIError{Code: 500, Message: "internal server error"}
    ErrForbidden = &APIError{Code: 403, Message: "permission denied"}
)

func handleRequest() error {
    return ErrForbidden
}

func main() {
    err := handleRequest()
    if apiErr, ok := err.(*APIError); ok {
        fmt.Printf("API 錯誤碼: %d\n", apiErr.Code)
    }
}

最佳實踐總結

  • ✅ 使用結構體攜帶錯誤上下文(如字段、ID、狀態)
  • ✅ 實現Error()方法返回清晰信息
  • ✅ 返回錯誤指針,便於類型比較
  • ✅ 使用errors.Is()判斷預定義錯誤
  • ✅ 使用errors.As()提取自定義錯誤類型
  • ✅ 用%w包裝底層錯誤,保留堆棧和類型
  • ❌ 避免直接比較錯誤字符串

基本上就這些常見模式。根據你的場景選擇:簡單用var err = errors.New(...) ,複雜用結構體接口判斷。

以上是以示例為例自定義錯誤類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

將Golang服務與現有Python基礎架構集成的策略 將Golang服務與現有Python基礎架構集成的策略 Jul 02, 2025 pm 04:39 PM

TOIntegrategolangServicesWithExistingPypythoninFrasture,userestapisorgrpcForinter-serviceCommunication,允許GoandGoandPyThonAppStoStoInteractSeamlessSeamLlyThroughlyThroughStandArdArdAdrotized Protoccols.1.usererestapis(ViaFrameWorkslikeSlikeSlikeGiningOandFlaskInpyThon)Orgrococo(wirs Propococo)

了解Web API的Golang和Python之間的性能差異 了解Web API的Golang和Python之間的性能差異 Jul 03, 2025 am 02:40 AM

Golangofferssuperiorperformance,nativeconcurrencyviagoroutines,andefficientresourceusage,makingitidealforhigh-traffic,low-latencyAPIs;2.Python,whileslowerduetointerpretationandtheGIL,provideseasierdevelopment,arichecosystem,andisbettersuitedforI/O-bo

是Golang前端還是後端 是Golang前端還是後端 Jul 08, 2025 am 01:44 AM

Golang主要用於後端開發,但也能在前端領域間接發揮作用。其設計目標聚焦高性能、並發處理和系統級編程,適合構建API服務器、微服務、分佈式系統、數據庫操作及CLI工具等後端應用。雖然Golang不是網頁前端的主流語言,但可通過GopherJS編譯成JavaScript、通過TinyGo運行於WebAssembly,或搭配模板引擎生成HTML頁面來參與前端開發。然而,現代前端開發仍需依賴JavaScript/TypeScript及其生態。因此,Golang更適合以高性能後端為核心的技術棧選擇。

如何完全,乾淨地從我的系統中卸載Golang? 如何完全,乾淨地從我的系統中卸載Golang? Jun 30, 2025 am 01:58 AM

TocompletelyuninstallGolang,firstdeterminehowitwasinstalled(packagemanager,binary,source,etc.),thenremoveGobinariesanddirectories,cleanupenvironmentvariables,anddeleterelatedtoolsandcaches.Beginbycheckinginstallationmethod:commonmethodsincludepackage

如何使用自定義字段名稱將golang結構元載到JSON? 如何使用自定義字段名稱將golang結構元載到JSON? Jun 30, 2025 am 01:59 AM

在Go中,若希望結構體字段在轉換為JSON時使用自定義字段名,可通過結構體字段的json標籤實現。 1.使用json:"custom_name"標籤指定字段在JSON中的鍵名,如Namestringjson:"username""會使Name字段輸出為"username";2.添加,omitempty可控製字段為空值時省略輸出,例如Emailstringjson:"email,omitempty""

如何安裝去 如何安裝去 Jul 09, 2025 am 02:37 AM

安裝Go的關鍵在於選擇正確版本、配置環境變量並驗證安裝。 1.前往官網下載對應系統的安裝包,Windows使用.msi文件,macOS使用.pkg文件,Linux使用.tar.gz文件並解壓至/usr/local目錄;2.配置環境變量,在Linux/macOS中編輯~/.bashrc或~/.zshrc添加PATH和GOPATH,Windows則在系統屬性中設置PATH為Go的安裝路徑;3.使用goversion命令驗證安裝,並運行測試程序hello.go確認編譯執行正常。整個流程中PATH設置和環

安裝後如何修復' GO:找不到命令”? 安裝後如何修復' GO:找不到命令”? Jun 30, 2025 am 01:54 AM

“Go:commandnotfound”通常因環境變量未正確配置導致;1.檢查是否已正確安裝Go,使用whichgo確認路徑;2.手動將Go的bin目錄(如/usr/local/go/bin)添加到PATH環境變量;3.修改對應shell的配置文件(如.bashrc或.zshrc),執行source使配置生效;4.可選設置GOROOT、GOPATH以避免後續模塊問題。完成上述步驟後運行goversion驗證是否修復。

典型Golang vs Python Web服務的資源消耗(CPU/內存)基準 典型Golang vs Python Web服務的資源消耗(CPU/內存)基準 Jul 03, 2025 am 02:38 AM

Golang在構建Web服務時CPU和內存消耗通常低於Python。 1.Golang的goroutine模型調度高效,並發請求處理能力強,CPU使用率更低;2.Go編譯為原生代碼,運行時不依賴虛擬機,內存佔用更小;3.Python因GIL和解釋執行機制,在並發場景下CPU和內存開銷更大;4.雖然Python開發效率高、生態豐富,但資源消耗較高,適合併發要求不高的場景。

See all articles