3 回答

TA貢獻1785條經驗 獲得超8個贊
首先,每當你有一個“如何在實踐中使用”的問題時,一個好的開始方法是搜索Go 源代碼(或任何足夠大的 Go 代碼庫,真的),以及包文檔以獲得答案。
現在,os.Exit
和panic
現在大不相同。panic
當程序或其部分達到不可恢復狀態時使用。
當
panic
被調用時,包括隱式的運行時錯誤,例如索引切片越界或類型斷言失敗,它會立即停止當前函數的執行并開始展開 goroutine 的堆棧,并在此過程中運行任何延遲的函數。如果展開到達 goroutine 堆棧的頂部,程序就會終止。
os.Exit
當您需要立即中止程序時使用,沒有恢復或運行延遲清理語句的可能性,并且還返回錯誤代碼(其他程序可以用來報告發生的情況)。這在測試中很有用,當您已經知道在這個測試失敗后,另一個也會失敗,所以您不妨現在就退出。當您的程序完成了它需要做的所有事情,現在只需要退出時,也可以使用它,即在打印幫助消息后。
大多數時候你不會使用panic
(你應該返回一個error
),并且你幾乎不需要os.Exit
在測試中的某些情況和快速程序終止之外。

TA貢獻1921條經驗 獲得超9個贊
首先,os.Exit()
可以用來正常退出程序而不會出錯,而不是panic,所以這是一個關鍵的區別。另一個是使用recover
.
但如果我們談論的是錯誤的退出代碼,讓我們說:
panic
當出現嚴重錯誤時使用,可能是應該在投入生產之前發現的程序員錯誤。這就是它打印堆棧的原因。
os.Exit(errorCode)
如果你想使用或類似的東西:
出于腳本目的控制程序的退出代碼。
想要在預期的錯誤(例如用戶輸入錯誤)上有序退出。
所以基本上恐慌是給你的,一個錯誤的退出代碼是給你的用戶的。

TA貢獻1757條經驗 獲得超7個贊
主要區別是:
os.Exit
跳過延遲函數的執行。使用
os.Exit
,您可以指定退出代碼。panic
正在終止而os.Exit
不是。(似乎其他答案沒有提到這一點。)
如果你需要執行延遲函數,你別無選擇,只能panic
. (另一方面,如果您想跳過延遲函數的執行,請使用os.Exit
.)
如果以這種方式定義非空函數:
該函數包含很多分支
所有分支都以
return
或終止panic
那么你不能用替換panic
,os.Exit
否則編譯器會拒絕編譯程序,說“在函數結束時缺少返回”。(Go 在這里非常愚蠢,甚至log.Panic
不終止函數。)
在其他條件下:
使用
panic
時的東西真的發生了連線,如編程邏輯錯誤。使用
os.Exit
時,你要立即退出,與指定的退出代碼。
- 3 回答
- 0 關注
- 281 瀏覽
添加回答
舉報