2022-11-02 02:56:04
在Go语言中,自定义异常处理流程主要通过实现error接口并利用标准库中的错误处理工具(如errors.As)来实现。以下是详细步骤和示例:
1. 定义自定义错误类型自定义类型需实现error接口的Error() string方法,并可扩展额外字段(如错误码、上下文信息等):
import ( "errors" "fmt")// CustomError 自定义错误类型type CustomError struct { Code int // 错误码 Message string // 错误描述 Cause error // 原始错误(可选)}// Error 实现error接口func (e *CustomError) Error() string { return fmt.Sprintf("Code: %d, Message: %s", e.Code, e.Message)}// Unwrap 实现errors.Unwrap接口(用于链式错误处理)func (e *CustomError) Unwrap() error { return e.Cause}2. 创建自定义错误在业务逻辑中返回自定义错误:
func CallAPI() (*Response, error) { // 模拟API调用失败 return nil, &CustomError{ Code: 400, Message: "Invalid request parameters", Cause: errors.New("original error details"), }}3. 处理自定义错误使用errors.As将错误转换为自定义类型,提取额外信息:
func HandleError(err error) { var customErr *CustomError if errors.As(err, &customErr) { fmt.Printf("自定义错误 - Code: %d, Message: %sn", customErr.Code, customErr.Message) if customErr.Cause != nil { fmt.Println("原始错误:", customErr.Cause) } // 根据错误码执行特定逻辑 switch customErr.Code { case 400: fmt.Println("处理400错误:参数校验失败") case 500: fmt.Println("处理500错误:服务器内部错误") } } else { fmt.Println("默认错误处理:", err) }}4. 实战案例完整示例:模拟API调用并处理错误:
func main() { resp, err := CallAPI() if err != nil { HandleError(err) return } fmt.Println("API调用成功:", resp)}输出结果:
自定义错误 - Code: 400, Message: Invalid request parameters原始错误: original error details处理400错误:参数校验失败5. 高级用法通过这种方式,Go程序可以针对不同错误场景实现精细化控制,提升代码健壮性和可维护性。