亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么時候使用 os.Exit() 和 panic()?

什么時候使用 os.Exit() 和 panic()?

Go
青春有我 2021-09-13 16:26:00
有人可以解釋一下它們之間的主要區別os.Exit()以及panic()它們在 Go 中的實際使用方式嗎?
查看完整描述

3 回答

?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

首先,每當你有一個“如何在實踐中使用”的問題時,一個好的開始方法是搜索Go 源代碼(或任何足夠大的 Go 代碼庫,真的),以及包文檔以獲得答案。

現在,os.Exitpanic現在大不相同。panic當程序或其部分達到不可恢復狀態時使用。

panic被調用時,包括隱式的運行時錯誤,例如索引切片越界或類型斷言失敗,它會立即停止當前函數的執行并開始展開 goroutine 的堆棧,并在此過程中運行任何延遲的函數。如果展開到達 goroutine 堆棧的頂部,程序就會終止。

os.Exit當您需要立即中止程序使用,沒有恢復或運行延遲清理語句的可能性,并且還返回錯誤代碼(其他程序可以用來報告發生的情況)。這在測試中很有用,當您已經知道在這個測試失敗后,另一個也會失敗,所以您不妨現在就退出。當您的程序完成了它需要做的所有事情,現在只需要退出時,也可以使用它,即在打印幫助消息后。

大多數時候你不會使用panic(你應該返回一個error),并且你幾乎不需要os.Exit在測試中的某些情況和快速程序終止之外。


查看完整回答
反對 回復 2021-09-13
?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

首先,os.Exit()可以用來正常退出程序而不會出錯,而不是panic,所以這是一個關鍵的區別。另一個是使用recover.

但如果我們談論的是錯誤的退出代碼,讓我們說:

panic當出現嚴重錯誤時使用,可能是應該在投入生產之前發現的程序員錯誤。這就是它打印堆棧的原因。

os.Exit(errorCode)如果你想使用或類似的東西:

  1. 出于腳本目的控制程序的退出代碼。

  2. 想要在預期的錯誤(例如用戶輸入錯誤)上有序退出。

所以基本上恐慌是給你的,一個錯誤的退出代碼是給你的用戶的。


查看完整回答
反對 回復 2021-09-13
?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

主要區別是:

  1. os.Exit 跳過延遲函數的執行。

  2. 使用os.Exit,您可以指定退出代碼。

  3. panic正在終止而os.Exit不是。(似乎其他答案沒有提到這一點。)

如果你需要執行延遲函數,你別無選擇,只能panic. (另一方面,如果您想跳過延遲函數的執行,請使用os.Exit.)

如果以這種方式定義非空函數:

  1. 該函數包含很多分支

  2. 所有分支都以return或終止panic

那么你不能用替換panicos.Exit否則編譯器會拒絕編譯程序,說“在函數結束時缺少返回”。(Go 在這里非常愚蠢,甚至log.Panic不終止函數。)

在其他條件下:

  1. 使用panic時的東西真的發生了連線,如編程邏輯錯誤。

  2. 使用os.Exit時,你要立即退出,與指定的退出代碼。


查看完整回答
反對 回復 2021-09-13
  • 3 回答
  • 0 關注
  • 281 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號