> go语言中主要有两类错误:
> * error是可预见的错误,不会导致程序退出
> * panic是不可预见的错误,会导致程序退出。
## error基本用法
> go语言内置了一个错误接口
~~~
type error interface {
Error() string
}
~~~
> `errors包`提供了基本的错误实现
~~~
// 创建一个错误
errors.New("错误信息")
~~~
> 例子
~~~
package main
import (
"errors"
"fmt"
)
// 通常一个函数的错误信息,都会放在最后一个返回值
// 一般如果函数没有错误,返回的error就是nil
func DoTest() (int, error) {
// 返回错误
return 0, errors.New("错误信息!")
}
func main() {
_, err := DoTest()
// 判断错误
if err != nil {
fmt.Println(err)
}
}
~~~
## 自定义错误类型
> 我们只要实现错误接口,就可以自定义错误类型
~~~
package main
import (
"fmt"
"time"
)
// 自定义错误类型MyError
type MyError struct {
What string // 错误的原因
When time.Time // 错误发生的时间
}
// 实现error接口的方法
func (e *MyError) Error() string {
return fmt.Sprintf("happend at %v, %s", e.When, e.What)
}
// 测试自定义的错误
func dotest() error {
// 创建一个自定义错误,并返回
return &MyError{What: "it didn't work", When: time.Now()}
}
func main() {
if err := dotest(); err != nil {
fmt.Println(err)
}
}
~~~
## panic用法
> panic,类似其他语言throw抛出异常一样,通过函数调用链,一层层的把异常往上抛出去,如果没有人拦截异常,就会退出程序
~~~
package main
import "fmt"
func main() {
fmt.Println("a")
if true {
// 抛出panic错误,后面的代码不会运行
panic("出错啦!")
}
fmt.Println("b")
}
~~~
## 拦截panic错误
> 通过defer和recover实现拦截panic错误
~~~
package main
import "fmt"
// 演示拦截panic错误
func DoTest() {
// 延迟执行函数
defer func() {
// 在延迟执行函数中,通过recover拦截panic错误
if err := recover(); err != nil {
fmt.Println("拦截到错误:", err)
}
}()
// 抛出panic错误,后面代码不会执行
if true {
panic("panic错误")
}
fmt.Println("b")
}
func main() {
fmt.Println("a")
DoTest()
fmt.Println("c")
}
~~~
> 因为我们通过recover函数,在延迟执行函数中,拦截了Panic错误,除了抛出panic错误的函数被中断了,其他执行流程都不受影响,类似其他语言中的try/catch机制
- 基础知识
- 开发环境
- 包名规则
- 包初始化 (init)
- 基础数据类型
- 基础类型转换
- 格式化输出
- go指针
- 流程控制语句
- 函数定义
- 匿名函数
- 数组和切片
- map集合
- 结构体
- Interface接口
- 日期处理
- 数学计算
- 正则表达式
- 协程 (并发处理)
- channel
- waitgroup
- mutex (锁机制)
- websocket
- protobuf
- Redis
- 错误处理
- 打包程序
- NSQ消息队列
- 单元测试
- beego
- 安装入门
- Gin
- 快速入门
- 路由与控制器
- 处理请求参数
- 表单验证
- 处理响应结果
- 渲染HTML模版
- 访问静态文件
- Gin中间件
- Cookie处理
- Session处理
- Gin上传文件
- swagger
- pprof性能测试
- GORM
- 入门教程
- 模型定义
- 数据库连接
- 插入数据
- 查询数据
- 更新数据
- 删除数据
- 事务处理
- 关联查询
- 属于 (BELONG TO)
- 一对一 (Has One)
- 一对多 (Has Many)
- 多对多 (Many to Many)
- 预加载 (Preloading)
- 错误处理
- 第三方常用插件
- viper 读取配置文件
- zap 高性能日志
- Nginx代理配置
- Goland 快捷键