### 宕機
> **panic()**
> 調用panic()方法后,之后代碼都是無效的
```
package main
import "fmt"
func main() {
panic("宕機")
fmt.Println("宕機后這里不執行")
}
```
```
// 結果:
panic: 宕機
goroutine 1 [running]:
main.main()
d:/桌面/study/Go/1/hello.go:4 +0x27
exit status 2
```
### 宕機恢復
> Go語言使用內置函數recover來捕獲宕機
```
package main
import "fmt"
func pro() {
// 匿名函數
defer func() {
// pro函數退出前執行defer語句
fmt.Println("func pro exit")
}()
panic("Serius bug")
}
func main() {
// 匿名函數
defer func() {
// pro函數退出前執行defer語句
fmt.Println("func main exit")
}()
pro()
fmt.Println("Invalid code")
}
```
```
// 結果
func pro exit
func main exit
panic: Serius bug
goroutine 1 [running]:
main.pro()
d:/桌面/study/Go/1/hello.go:11 +0x49
main.main()
d:/桌面/study/Go/1/hello.go:20 +0x3f
exit status 2
```
原理
1,pro()函數內的panic方法實現宕機
2,由于pro()函數內匿名函數通過defer語句延遲執行,在panic觸發宕機后,匿名函數會打印"func pro exit"
3,main()函數內匿名函數通過defer語句延遲執行,退出前會打印"func main exit"
4,程序退出
由于defer語句延遲執行的特性,通過“ defer語句+匿名函數+recover方法”來對宕機的捕捉
```
package main
import "fmt"
func pro() {
// 匿名函數
defer func() {
// pro函數退出前執行defer語句
if err := recover(); err != nil {
// recover()捕獲panic()傳入的參數
fmt.Println(err)
}
}()
panic("Serius bug")
}
func main() {
pro()
fmt.Println("valid code")
}
// 結果
Serius bug
valid code
```
原理
通過recover方法獲取到panic傳入的參數,進行打印程序從當前宕機點退出當前函數后繼續執行
```
package main
import "fmt"
func pro(f func()) {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
f()
}
func main() {
pro(func() {
fmt.Println("This is func1")
panic("bug 1")
})
pro(func() {
fmt.Println("This is func2")
panic("bug 2")
})
fmt.Println("valid code")
}
This is func1
bug 1
This is func2
bug 2
valid code
```
```
實際編程中,我們會專門封裝一個函數,以一種安全模式來運行傳入所有方法
pro函數用于安全模式運行所有傳入的匿名函數或閉包的執行函數,即使發生panic,主程序也不會掛
```
- 安裝開發環境
- 安裝開發環境
- 安裝詳細教程
- 引入包
- Go語言基礎
- 基本變量與數據類型
- 變量
- 數據類型
- 指針
- 字符串
- 代碼總結
- 常量與運算符
- 常量
- 運算符
- 流程控制
- if判斷
- for循環
- switch分支
- goto跳轉
- 斐波那契數列
- Go語言內置容器
- 數組
- 切片
- 映射
- 函數
- 函數(上)
- 函數(中)
- 函數(下)
- 小節
- 包管理
- 結構體
- 結構體(上)
- 結構體(中)
- 結構體(下)
- 小節
- 錯誤處理
- 錯誤處理
- 宕機
- 錯誤應用
- 小節
- 文件操作
- 獲取目錄
- 創建和刪除目錄
- 文件基本操作(上)
- 文件基本操作(中)
- 文件基本操作(下)
- 處理JSON文件
- 接口與類型
- 接口的創建與實現
- 接口賦值
- 接口嵌入
- 空接口
- 類型斷言(1)
- 類型斷言(2)
- 小節
- 并發與通道
- goroutine協程
- runtime包
- 通道channel
- 單向通道channel
- select
- 線程同步
- 多線程的深入學習
- http編程
- http簡介
- Client和Request
- get請求
- post請求
- 模塊函數方法
- 模塊
- fmt庫,模塊
- 項目練習
- 爬蟲:高三網
- 爬蟲:快代理
- 爬蟲:快代理2
- 多線程:通道思路
- 多線程爬蟲:快代理