超簡短摘要:當出現錯誤時退出程式可能是個好主意。使用 gobail 會讓您的生活更輕鬆。
當你的 Go 程式碼出現錯誤時,你通常會看到類似這樣的內容:
您會在這個範例中註意到一些事情:
那麼接下來會發生什麼事?好吧,這一切又發生了。您檢查錯誤值,描述它,然後將其傳回。然後一切又重新開始。
我們為什麼要這樣做?為什麼要這麼努力?
這一切都取決於您正在編寫的軟體。當你遇到錯誤時,你必須做出決定。這個錯誤會發生什麼事?
如果您正在編寫一個回應請求的HTTP API,那麼最終您將獲得某種HTTP 處理程序,並將該錯誤轉換為某種回應- 也許是一個帶有禮貌提醒格式的小400正確請求或可能返回500 以及有關應用程式運行狀況的令人擔憂的消息。或者,如果您正在編寫某種 CLI 工具,那麼您可能會決定錯誤最終會一直傳回您的主函數。對於任何類型的程序,您可能會認為已經足夠了 - 該程序應該結束,因為您無法做任何其他事情。
讓我們來看看最後一個選項。什麼時候退出程序適合?我能想到的幾個原因:
a.沒有別的辦法了,錯誤太嚴重了,一切都必須立即停止
b.終止程序沒有任何後果(不需要清理,沒有狀態可以回應)
c.儘早停止是可取的,也許你有一個監視器可以乾淨地重新啟動該過程
無論什麼原因,你都需要考慮如何乾淨俐落地退出。現在您可能嘗試的第一件事是:
它看起來與我們原來的錯誤處理程式碼非常相似,但有一些重要的區別。第一個是顯而易見的-那裡有一個很棒的stop-right-g*****n-now聲明。你的程式不會繼續下去。第二點也許更重要。呼叫此範例的程式碼不必擔心處理任何錯誤。沒有其他需要測試的程式碼路徑 - 我們可以相信呼叫程式碼沒有要測試的 if 區塊,因為沒有傳回任何需要我們檢查的內容。
所以當我建議你應該相信你的退出代碼會起作用時,我可能有點熱情。您可能應該檢查新程序停止的原因是否正確。
這感覺應該很容易。這裡有一些需要考慮的事情 - 在最簡單的情況下,您只需運行程式並觸發錯誤條件。例如,讓 CLI 工具開啟一個不存在的檔案。對於一些簡單的情況,您可以手動執行此操作。當測試數量增加時,您可能需要某種自動化來幫助您。
快速旁注 - 這可能是另一篇部落格文章的主題,但我目前最喜歡的測試 CLI 工具的方法是使用 godog 來編寫測試。它可能有點複雜,但我發現它非常強大。以下是我如何使用layli和wait-for來處理它的一些很好的例子。
這種方法會讓您走得很遠,但有時可能很難創造條件來正確執行您想要確信的所有程式碼路徑。
好的,現在我們將使用 Go 語言的一些功能。我們實際上不必呼叫 os.Exit - 我們可以呼叫看起來像它的東西。所以看看這個:
那我們要如何利用這一點來進行測試呢?由於函數現在已轉換為變數 (customExit),因此我們可以用我們想要執行的其他操作來取代該值。就像這樣...
這是一種對單元測試更加友善的方法。您可以檢查使用的退出代碼是否正確 - 並且您實際上調用了退出函數。
從表面上看,這看起來不錯,但有一個大問題 - 如果您的測試通過,那麼您的程式將繼續並在您期望函數退出時執行該函數的其餘部分。即使測試設定意味著其餘的執行無效並導致測試出現問題(例如引起恐慌),它仍將繼續。
嗯,這聽起來有點極端!
我覺得我應該解釋一下......通常在「管理良好」的公司中,您需要確保每一行程式碼都已被證明是有效的,然後才能放在客戶面前。使用上述技術,您可能無法產生正確的覆蓋率指標來證明您的能力良好。即使推理起來微不足道。
上面的所有範例都假設當我們收到錯誤時,我們必須檢查它以決定要做什麼(報復性退出)。如果我們能夠退出而無需檢查是否存在錯誤,那不是很好嗎?
讓我們看看我們能做什麼。
看一下上面的範例。功能是相同的,但 myFunc 的實作現在更簡單 - 沒有條件。我們可以在自己的測試中檢查 checkExit 函數的實現,這意味著 myFunc() 中的任何新內容都可以更容易驗證。
建立了一個新的函式庫 gobail,它可以讓您確信如果發生錯誤,它將得到處理,而無需增加您自己的程式碼的複雜性。看起來像這樣:
這個函式庫已經過全面測試,並具有覆蓋率指標,以證明這一點。您可以安全地使用它,而不必擔心錯誤會被跳過。它還將處理具有 2 個返回值的函數,如下所示:
另請注意,您包含了導致所有問題的錯誤。
也可以發生恐慌而不是退出,在呼叫恐慌時列印堆疊追蹤和程式中的其他上下文資訊。請查看文件以了解更多詳細資訊。
當您使用 gobail 編寫軟體時,您會注意到在與外部程式庫互動時大多數情況下都必須使用它。這具有您通常需要編寫來處理所有錯誤情況的附加程式碼,可以將其包裝在對 Return 或 Return2 的呼叫中,並假設我們將在必要時退出。
有時需要退出程式而不是詳細處理錯誤。 gobail 庫已建立並經過驗證,因此您不必擔心證明這一點的細節。
如果您發現可以進行的改進或只是有建議,請在儲存庫上提出 PR 或問題,開發人員會盡快處理!
以上是為了勝利早早退場!的詳細內容。更多資訊請關注PHP中文網其他相關文章!