> 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 快捷鍵