網站首頁 編程語言 正文
前言:
Go 語言追求簡潔優雅,所以,Go 語言不支持傳統的 try…catch…finally
這種處理。
Go 中引入的錯誤處理方式為:defer, panic, recover,也僅僅是錯處處理的模擬
Go語言的作者認為java等語言的錯誤處理底層實現較為復雜,就實現了函數可以返回錯誤類型以及
簡單的異常捕獲,雖然簡單但是也非常精妙,大大的提高了運行效率。
一、error變量可以做什么
1.定義一個error變量
①直接new一個
err := errors.New("我是錯誤處理語句")
②實現Error接口
只要實現了Error接口就可以被error類型所接收,打印的時候會直接打印實現接口時,方法返回的字符串。
官方接口如下:
type error interface { ? ? Error() string }
代碼如下:
//定義一個結構體 type man struct { ?? ?age int } //實現接口 func (a man) Error() string { ?? ?str := "這是一個錯誤接口" ?? ?return str } //創建函數返回錯誤類型 func judgeAge() (int, error) { ?? ?var a man ?? ?return 0, a } //主函數調用 func main() { ?? ?_, e := judgeAge() ?? ?if e!=nil{ ?? ??? ?fmt.Println(e) ?? ?} }
2.錯誤的處理
?? ?將如果錯誤變量不為空,則將錯誤進行捕獲打印,這里直接打印到了控制臺,可以將錯誤打印到日志文件內,為以后系統的維護做保障。
代碼如下:
package main import ( ?? ?"errors" ?? ?"fmt" ) func main() { ?? ?err := errors.New("我是錯誤處理語句") ?? ?if err != nil { ?? ??? ?fmt.Println(err) ?? ?}else { ?? ??? ?fmt.Println("沒有錯誤") ?? ?} ?? ?fmt.Println(123) }
3.做函數返回值
- 如果函數返回的錯誤類型值不為空,則將其進行打印
代碼如下:
package main import ( ?? ?"errors" ?? ?"fmt" ) func test(num1,num2 int) error { ?? ?if num2 == 0 { ?? ??? ?return errors.New("除數為零") ?? ?} ?? ?res := num1 / num2 ?? ?fmt.Println("計算結果為=", res) ?? ?return nil } func main() { ?? ?err := test(11,0) ?? ?if err!=nil{ ?? ??? ?fmt.Println(err) ?? ?} }
4.做函數參數
一般用作處理錯誤變量,在需要進行錯誤檢驗的時候調用函數,不用再進行判斷了
代碼如下:
func PrintError(err error){ ?? ?if err!=nil{ ?? ??? ?fmt.Println(err) ?? ?} }
二、模擬異常的捕獲與拋出
1.defer簡介
?defer
后面定義的東西是在調用函數執行完的時候執行的代碼,一般用于文件描述符、數據庫對象的關閉(在之前講管道的時候有介紹過)
?defer什么什么延時執行
代碼如下:
func pDefer() { ?? ?defer fmt.Println("hahaha") ?? ?fmt.Println("hello") } func main() { ?? ?pDefer() } /* 打印結果 ?? ?hello ?? ?hahaha */
2.使用recover模擬異常的捕獲
代碼如下:
package main import ( ?? ?"fmt" ) func test() { ?? ?//使用defer + recover 來捕獲和處理異常(返回錯誤變量) ?? ?//函數執行末尾執行這個匿名函數 ?? ? defer func() { ?? ? ?? ?err := recover() // recover()內置函數,可以捕獲到異常 ?? ? ?? ?if err != nil { ?//說明捕獲到錯誤 ?? ? ?? ??? ?fmt.Println(err) ?? ? ?? ?} ?? ? }() ?? ?num1 := 10 ?? ?num2 := 0 ?? ?res := num1 / num2 ?? ?fmt.Println("計算結果為=", res) } func main() { ?? ?test() }
3.使用panic主動拋出錯誤
異常的捕獲,使程序還能夠正常的運行,如果有致命錯誤就需要進行錯誤的拋出了,也就是宕機,不到迫不得已千萬不要使用這個函數,有可能會造成大量數據的丟失
代碼如下:
package main import ( ?? ?"errors" ?? ?"fmt" ) func test() error { ?? ?num1 := 10 ?? ?num2 := 0 ?? ?if num2 == 0 { ?? ??? ?return errors.New("除數為零") ?? ?} ?? ?res := num1 / num2 ?? ?fmt.Println("計算結果為=", res) ?? ?return nil } func main() { ?? ?//無論err是否為空,都進行程序的終止 ?? ? panic(test())//內置函數2,參數使一個interface接口 }
運行結果:
總結:
Go語言雖然沒有一個較為成熟的異常捕獲機制,但是其精簡的錯誤處理仍舊能夠滿足其需求,減少錯誤的處理大大的加快了我們的開發效率,代碼的運行效率。
原文鏈接:https://blog.csdn.net/apple_51931783/article/details/122573931
相關推薦
- 2022-07-30 C語言強制類型轉換規則實例詳解_C 語言
- 2023-02-15 PyQt5+PyQt5Designer的安裝步驟_python
- 2022-03-25 C#?SQLite庫使用技巧_C#教程
- 2024-03-02 Quasar框架使用環境變量聲明接口地址,無需手動判斷
- 2022-10-22 C#抽象類的用法介紹_實用技巧
- 2022-08-21 Python列表去重的幾種方法整理_python
- 2022-09-29 DevExpress的DateEdit設置顯示日期和時間的方法_C#教程
- 2022-04-09 Android項目中gradle的執行流程_Android
- 最近更新
-
- 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同步修改后的遠程分支