Go語(yǔ)言錯(cuò)誤處理如何優(yōu)雅實(shí)現(xiàn)

小樊
81
2024-10-25 13:21:10

在Go語(yǔ)言中,優(yōu)雅地處理錯(cuò)誤通常遵循以下幾個(gè)原則:

  1. 明確錯(cuò)誤處理:在函數(shù)簽名中明確返回錯(cuò)誤類型,并在函數(shù)體內(nèi)引發(fā)錯(cuò)誤時(shí)返回具體的錯(cuò)誤信息。
func Divide(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("division by zero")
    }
    return a / b, nil
}
  1. 使用deferrecover處理panic:在可能出現(xiàn)panic的地方使用deferrecover來(lái)捕獲panic并優(yōu)雅地處理錯(cuò)誤。
func SafeFunction() (result string, err error) {
    defer func() {
        if r := recover(); r != nil {
            err = fmt.Errorf("panic occurred: %v", r)
        }
    }()
    // 可能引發(fā)panic的操作
    return "success", nil
}
  1. 使用自定義錯(cuò)誤類型:創(chuàng)建自定義錯(cuò)誤類型,以便在錯(cuò)誤處理時(shí)提供更多上下文信息。
type CustomError struct {
    Code    int
    Message string
}

func (e *CustomError) Error() string {
    return fmt.Sprintf("code: %d, message: %s", e.Code, e.Message)
}

func Divide(a, b int) (int, error) {
    if b == 0 {
        return 0, &CustomError{Code: 400, Message: "division by zero"}
    }
    return a / b, nil
}
  1. 使用errorsfmt包處理錯(cuò)誤:利用errors包創(chuàng)建錯(cuò)誤,使用fmt包格式化錯(cuò)誤信息。
import (
    "errors"
    "fmt"
)

func Divide(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("division by zero")
    }
    return a / b, nil
}
  1. 使用log包記錄錯(cuò)誤日志:在處理錯(cuò)誤時(shí),使用log包記錄錯(cuò)誤日志,以便于排查問(wèn)題。
import (
    "errors"
    "log"
)

func Divide(a, b int) (int, error) {
    if b == 0 {
        log.Printf("error: division by zero")
        return 0, errors.New("division by zero")
    }
    return a / b, nil
}
  1. 使用context包傳遞錯(cuò)誤上下文:在處理跨多個(gè)goroutine的錯(cuò)誤時(shí),使用context包傳遞錯(cuò)誤上下文信息。
import (
    "context"
    "errors"
)

func Divide(ctx context.Context, a, b int) (int, error) {
    if b == 0 {
        return 0, context.NewCanceledError("division by zero")
    }
    return a / b, nil
}

通過(guò)遵循以上原則,你可以在Go語(yǔ)言中優(yōu)雅地處理錯(cuò)誤。

0