【go】異常處理panic和recover

panic 和 recover

當然能觸發程序宕機退出的,也可以是我們自己,比如經過檢查判斷,當前環境無法達到我們程序進行的預期條件時(比如一個服務指定監聽端口被其他程序占用),可以手動觸發 panic,讓程序退出停止運行。

1. 觸發panic

手動觸發宕機,是非常簡單的一件事,只需要調用 panic 這個內置函數即可,就像這樣子

package mainfunc main() {panic("crash")
}

運行結果:

panic: crashgoroutine 1 [running]:
main.main()d:/Goworks/src/尚硅谷/異常處理/demo01.go:4 +0x25
exit status 2

2. 捕獲 panic

發生了異常,有時候就得捕獲,就像 Python 中的except 一樣,那 Golang 中是如何做到的呢?

這就不得不引出另外一個內建函數 – recover,它可以讓程序在發生宕機后起生回生。

但是 recover 的使用,有一個條件,就是它必須在 defer 函數中才能生效,其他作用域下,它是不工作的。

這是一個簡單的例子

package mainimport "fmt"func set_data(x int) {defer func() {// recover() 可以將捕獲到的panic信息打印if err := recover(); err != nil {fmt.Println(err)}}()// 故意制造數組越界,觸發 panicvar arr [10]intarr[x] = 88
}func main() {set_data(20)// 如果能執行到這句,說明panic被捕獲了// 后續的程序能繼續運行fmt.Println("everything is ok")
}

運行結果:

捕獲到panic后正常運行。

runtime error: index out of range [20] with length 10
everything is ok

3. 無法跨協程

從上面的例子,可以看到,即使 panic 會導致整個程序退出,但在退出前,若有 defer 延遲函數,還是得執行完 defer 。

但是這個 defer 在多個協程之間是沒有效果,在子協程里觸發 panic,只能觸發自己協程內的 defer,而不能調用 main 協程里的 defer 函數的。

來做個實驗就知道了

package mainimport ("fmt""time"
)func main() {// 這個 defer 并不會執行defer fmt.Println("in main")go func() {defer println("in goroutine")// 這個panic就會終止程序// 在這終止了外面的defer也不會執行panic("")}()time.Sleep(2 * time.Second)
}

輸出如下,并沒有執行defer fmt.Println(“in main”)

in goroutine
panic:goroutine 19 [running]:
main.main.func1()d:/Goworks/src/尚硅谷/異常處理/demo03.go:14 +0x3e
created by main.main in goroutine 1d:/Goworks/src/尚硅谷/異常處理/demo03.go:12 +0x59
exit status 2

4. 總結

Golang 異常的拋出與捕獲,依賴兩個內置函數:

  • panic:拋出異常,使程序崩潰
  • recover:捕獲異常,恢復程序或做收尾工作(通常來說,不應該對進入 panic 宕機的程序做任何處理,但有時,需要我們可以從宕機中恢復,至少我們可以在程序崩潰前,做一些操作,舉個例子,當 web 服務器遇到不可預料的嚴重問題時,在崩潰前應該將所有的連接關閉,如果不做任何處理,會使得客戶端一直處于等待狀態,如果 web 服務器還在開發階段,服務器甚至可以將異常信息反饋到客戶端,幫助調試。)

revocer 調用后,拋出的 panic 將會在此處終結,不會再外拋,但是 recover,并不能任意使用,它有強制要求,必須得在 defer 下才能發揮用途。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74161.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74161.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74161.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CSS層疊順序

介紹 在 CSS 中,元素的層疊順序決定了當多個元素重疊時(跟布局沒有完全的關系,也就是說層疊順序只會在幾個疊放元素上進行比較,而不會改變布局),哪個元素顯示在最上面,哪個元素顯示在最下面。 …

數制——FPGA

1、定點數 定點數的三種表示方式: 原碼:符號位 絕對值 表示方法 反碼:正數的反碼表示 與原碼表示一致,負數的反碼表示 除符號位,其他位全都取反 補碼:正數的補碼表示 與原碼表示一致,負數的補碼…

在用redis當中可能遇到的問題解決方案以及redis中的一些名詞解釋

在用redis當中可能遇到的問題解決方案以及redis中的一些名詞解釋 Redis篇一、緩存穿透:解決方案:緩存空數據布隆過濾器 二、緩存擊穿解決方案互斥鎖,強一致性,性能差,速度慢邏輯過期,數據不同步&#xff0c…

一文詳解QT環境搭建:Windows使用CLion配置QT開發環境

在當今的軟件開發領域,跨平臺應用的需求日益增長,Qt作為一款流行的C圖形用戶界面庫,因其強大的功能和易用性而備受開發者青睞。與此同時,CLion作為一款專為C/C打造的強大IDE,提供了豐富的特性和高效的編碼體驗。本文將…

【區塊鏈安全 | 第二十四篇】單位和全局可用變量(二)

文章目錄 單位和全局可用變量(Units and Globally Available Variables)特殊變量和函數1. 區塊和交易屬性2. ABI 編碼和解碼函數3. bytes 成員函數4. string 成員函數5. 錯誤處理6. 數學和加密函數7. 地址類型成員函數8. 與合約相關9. 類型信息 單位和全…

一種監控錄像視頻恢復的高效解決方案,從每一幀中尋找可能性

該軟件旨在恢復從監控設備中刪除或丟失的視頻。該程序經過調整以處理大多數流行供應商的閉路電視系統中使用的專有格式,并通過智能重建引擎進行了增強,能夠為監控記錄提供任何通用解決方案都無法實現的恢復結果。如果不需要持續使用該軟件,則…

網紅指路機器人是否支持環境監測功能?

嘿呀,你可知道?如今的叁仟網紅指路機器人那可太牛啦!它們可不單單局限于為行人指明方向,還紛紛兼職當起了 “環境小衛士”,為咱們的城市生活注入了前所未有的超智能便利。就拿那個依托叁仟智慧桿打造的數智指路機器人來…

Navicat導出mysql數據庫表結構說明到excel、word,單表導出方式記錄

目前只找到一張一張表導出的方式 使用information_schema傳入表名查詢 字段名根據需要自行刪減,一般保留序號、字段名、類型、說明就行 SELECT COLUMNS.ORDINAL_POSITION AS 序號, COLUMNS.COLUMN_NAME AS 字段名, COLUMNS.COLUMN_TYPE AS 類型(長度), COLUMNS.N…

MySQL主從數據庫搭建

此方案可適用于Centos 7、OpenEuler、Ubuntu操作系統。 在國產銀河麒麟V10中,虛擬機中啟動的麒麟系統使用當前方案并未遇到問題,但是在服務器上安裝時,執行到初始化時出現了找不到依賴問題(目前已解決安裝問題),后續我會繼續更新該問題解決方案。 1. 創建主、從安裝目錄…

`git commit --amend` 詳解:修改提交記錄的正確方式

文章目錄 git commit --amend 詳解:修改提交記錄的正確方式1. 修改提交信息2. 補充遺漏的文件3. 結合 --amend 進行交互式修改4. 已推送提交的修改總結 git commit --amend 詳解:修改提交記錄的正確方式 git commit --amend 用于修改最近一次的提交&…

為什么package.json里的npm和npm -v版本不一致?

這個情況出現是因為package.json里的 npm 版本和系統實際使用的 npm 版本是兩個不同的概念。讓我來解釋一下: 原因解釋 全局 npm vs 項目依賴: npm -v顯示的是系統全局安裝的 npm 版本(位于/usr/bin/npm或類似路徑)package.jso…

python系統之綜合案例:用python打造智能詩詞生成助手

不為失敗找理由,只為成功找方法。所有的不甘,因為還心存夢想,所以在你放棄之前,好好拼一把,只怕心老,不怕路長。 python系列之綜合案例 前言一、項目描述二、項目需求三、 項目實現1、開發準備2、代碼實現 …

Java常用工具算法-1--哈希算法(MD5,SHA家族,SHA-256,BLAKE2)

1、概述 哈希算法(Hash Algorithm),又稱散列算法,是一種將任意長度的輸入數據(明文)轉換為固定長度的輸出(哈希值/摘要)的數學算法。 哈希值通常被稱為摘要(Digest&…

OpenMCU(五):STM32F103時鐘樹初始化分析

概述 本文主要描述了STM32F103初始化過程系統時鐘的初始化,主要描述了系統時鐘的初始化,AHB總線時鐘,APB總線時鐘等的初始化。 硬件板卡3d圖 時鐘樹 STM32F103的時鐘樹,如下所示: 時鐘源選擇 從STM32F103的時鐘樹框圖,我們可以…

【qt】文件類(QFile)

很高興你能看到這篇文章,同時我的語雀文檔也更新了許多嵌入式系列的學習筆記希望能幫到你 : https://www.yuque.com/alive-m4b9n 目錄 QFile 主要功能QFile 操作步驟QFile 其他常用函數案例分析及實現功能一實現:打開文件并顯示功能二實現:另…

基于AT89C52單片機的輪胎壓力監測系統

點擊鏈接獲取Keil源碼與Project Backups仿真圖: https://download.csdn.net/download/qq_64505944/90545655?spm1001.2014.3001.5503 功能介紹: 采用MPX4115壓力傳感器進行輪胎壓力檢測;使用LCD液晶顯示器顯示輪胎壓力;若壓力過…

shell腳本--MySQL簡單調用

實現功能 增 數據庫的創建,數據表的創建已經實現 創建用戶 刪 刪除數據庫, 刪除庫下的某個表, 刪除某個用戶 改 暫無 查 查看所有的數據庫, 查看某個庫下的所有數據表, 查看某個表的結構, 查…

計算機網絡 OSI參考模型

目錄 OSS七層 OSI通信過程1 OSI通信過程2 應用層 表示層 會話層 傳輸層 網絡層 數據鏈路層 物理層 OSS七層 OSI通信過程1 OSI通信過程2 應用層 表示層 會話層 傳輸層 網絡層 數據鏈路層 物理層

2025年華為HCIP題庫分享

1101、 【拖拽題】OPSF鄰接關系建立的過程中需要使用不同的報文,那么請分別將以下各個狀態和該狀態使用的報文聯系起來。 答題格式為:11 22 33 43 正確答案:【12】【21】【24】【33】 解析: 建立鄰居關系 RouterA的一個連接到廣…

DIskgenius使用說明

文章目錄 一、概述1. 軟件簡介2. 系統要求 二、核心功能1. 分區管理(1) 查看磁盤分區(2) 創建與刪除分區(3) 調整分區大小(4) 格式化分區 2. 數據恢復(1) 恢復已刪除文件(2) 恢復丟失分區(3) 恢復誤格式化分區 3. 磁盤復制(1) 克隆磁盤(2) 磁盤鏡像 4. 文件操作(1) 文件復制與移…