網站首頁 編程語言 正文
err接口
Go語言引入了一個關于錯誤處理的標準模式,即error接口,它是Go語言內建的接口類型,該接口的定義如下:
type error interface { Error() string }
調用對應接口
err:=errors.New("this is normal err") fmt.Println(err.Error()) err2:=fmt.Errorf("this is normal err") fmt.Println(err2)
案例:除數b為0時
package main import ( "errors" "fmt" ) func main() { //接收錯誤信息和正確信息 result,err := test(5,0) //加了判斷,如果沒有錯誤err=nil if err!=nil{ fmt.Println(err) }else { fmt.Println(result) } } //b為0時拋出異常 func test(a,b int) (result int, err error) { //返回錯誤信息 err = nil if b==0{ err =errors.New("b不能為0") }else { result = a/b } return }
panic函數
error返回的是一般性的錯誤,但是panic函數返回的是讓程序崩潰的錯誤。
一般而言,當panic異常發生時,程序會中斷運行。
所以,我們在實際的開發過程中并不會直接調用panic( )函數,但是當我們編程的程序遇到致命錯誤時,系統會自動調用該函數來終止整個程序的運行,也就是系統內置了panic函數。
案例
package main import "fmt" func main() { test1() test2() test3() } func test1() { fmt.Println("test1") } func test2() { panic("panic test2") //程序中斷 } func test3() { fmt.Println("test3") }
結果:
test1
panic: panic test2
goroutine 1 [running]:
main.test2(...)
defer延遲
總結
關鍵字 defer?于延遲一個函數的執行,調用了,但是沒有執行,也會完成參數的傳遞
defer fmt.Println("333") defer fmt.Println("222") defer fmt.Println("111") 依次輸出順序:111,222,333
如果一個函數中有多個defer語句,它們會以后進先出的順序執行。
注意,defer語句只能出現在函數的內部。
defer與匿名函數結合使用
案例1:無參數
package main import "fmt" func main() { a := 10 b := 20 defer func() { fmt.Println("匿名函數a", a) fmt.Println("匿名函數b", b) }() a = 100 b = 200 fmt.Println("main函數a", a) fmt.Println("main函數b", b) }
結果:
main函數a 100
main函數b 200
匿名函數a 100
匿名函數b 200
案例二:有參數
package main import "fmt" func main() { a := 10 b := 20 //調用了,也傳參數了,但是沒有執行 defer func(a,b int) { //添加參數 fmt.Println("匿名函數a", a) fmt.Println("匿名函數b", b) }(a,b) //傳參數 a = 100 b = 200 fmt.Println("main函數a", a) fmt.Println("main函數b", b) }
結果:
main函數a 100
main函數b 200
匿名函數a 10
匿名函數b 20
recover防止程序中斷
運行時panic異常一旦被引發就會導致程序崩潰。這當然不是我們愿意看到的,因為誰也不能保證程序不會發生任何運行時錯誤。
Go語言為我們提供了專用于“攔截”運行時panic的內建函數——recover。它可以是當前的程序從運行時panic的狀態中恢復并重新獲得流程控制權。
注意:recover只有在defer調用的函數中有效。
func testA() { fmt.Println("testA") } func testB(x int) { //設置recover() //在defer調用的函數中使用recover() defer func() { //防止程序崩潰 //recover() //fmt.Println(recover()) //加了一層判斷 if err:=recover();err!=nil { fmt.Println(err) } }() //匿名函數 var a [3]int a[x] = 999 } func testC() { fmt.Println("testC") } func main() { testA() testB(0) //發生異常 中斷程序 testC() }
原文鏈接:https://www.cnblogs.com/guyouyin123/p/13891048.html
相關推薦
- 2022-06-29 在Oracle中使用正則表達式_oracle
- 2023-01-05 C++的new和delete使用示例詳解_C 語言
- 2022-07-24 python雙向循環鏈表實例詳解_python
- 2022-02-26 sparksql之通過 structType 創建 DataFrames(編程接口)
- 2022-12-26 Python?gRPC流式通信協議詳細講解_python
- 2022-09-26 Mybatis的一級緩存和二級緩存及其區別
- 2022-10-15 Qt網絡編程實現TCP通信_C 語言
- 2022-07-13 Docker的數據管理
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支