在Go語(yǔ)言中,優(yōu)雅地處理錯(cuò)誤通常遵循以下幾個(gè)原則:
func Divide(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("division by zero")
}
return a / b, nil
}
defer
和recover
處理panic:在可能出現(xiàn)panic的地方使用defer
和recover
來(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
}
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
}
errors
和fmt
包處理錯(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
}
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
}
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ò)誤。