Go语言通过panic和recover机制结合自定义结构体实现类似异常处理的行为。定义实现error接口的CustomException结构体,可携带错误码和消息;在riskyOperation中panic该结构体实例;safeCall通过defer和recover捕获并用类型断言判断是否为*CustomException,实现精准处理。适用于框架错误拦截、深层调用快速退出等场景,但常规错误仍推荐使用error返回。

在Go语言中,没有传统意义上的“异常”机制,而是通过
panic
recover
error
panic
recover
你可以通过定义一个结构体来表示特定的“异常”类型,使其携带更多信息,比如错误码、消息、时间戳等。
例如:
type CustomException struct {
Code int
Message string
}
func (e *CustomException) Error() string {
return fmt.Sprintf("[Error %d] %s", e.Code, e.Message)
}
这个结构体实现了
error
立即学习“go语言免费学习笔记(深入)”;
你可以在特定逻辑中触发
panic
error
示例:
func riskyOperation() {
// 模拟某种业务异常
if someCondition {
panic(&CustomException{
Code: 1001,
Message: "业务逻辑校验失败",
})
}
}
使用
defer
recover
示例:
func safeCall() {
defer func() {
if r := recover(); r != nil {
switch ex := r.(type) {
case *CustomException:
fmt.Printf("捕获自定义异常: %v\n", ex)
// 可以根据Code做不同处理
if ex.Code == 1001 {
log.Println("执行回滚操作")
}
default:
// 非自定义异常,重新panic或记录
fmt.Printf("未知panic: %v\n", r)
panic(r) // 重新抛出
}
}
}()
riskyOperation()
}
这里利用类型断言
r.(type)
*CustomException
虽然Go不鼓励滥用panic,但在以下场景中结合自定义异常是有意义的:
基本上就这些。关键是利用结构体+Error接口+panic/recover+类型断言,实现类似“异常类”的行为,同时保持Go的简洁风格。注意不要过度使用,常规错误仍应通过
error
以上就是Golang自定义异常类型与recover结合使用的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号