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

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

Golang在並發性上優於C ,而C 在原始速度上優於Golang。 1)Golang通過goroutine和channel實現高效並發,適合處理大量並發任務。 2)C 通過編譯器優化和標準庫,提供接近硬件的高性能,適合需要極致優化的應用。

goisidealforbeginnersandsubableforforcloudnetworkservicesduetoitssimplicity,效率和concurrencyFeatures.1)installgromtheofficialwebsitealwebsiteandverifywith'.2)

Golang適合快速開發和並發場景,C 適用於需要極致性能和低級控制的場景。 1)Golang通過垃圾回收和並發機制提升性能,適合高並發Web服務開發。 2)C 通過手動內存管理和編譯器優化達到極致性能,適用於嵌入式系統開發。

goimpactsdevelopmentpositationality throughspeed,效率和模擬性。 1)速度:gocompilesquicklyandrunseff,IdealforlargeProjects.2)效率:效率:ITScomprehenSevestAndardArdardArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdEcceSteral Depentencies,增強的Depleflovelmentimency.3)簡單性。

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。Golang以其并发模型和高效性能著称,Python则以简洁语法和丰富库生态系统著称。

Golang和C 在性能上的差異主要體現在內存管理、編譯優化和運行時效率等方面。 1)Golang的垃圾回收機制方便但可能影響性能,2)C 的手動內存管理和編譯器優化在遞歸計算中表現更為高效。

Golang和C 在性能競賽中的表現各有優勢:1)Golang適合高並發和快速開發,2)C 提供更高性能和細粒度控制。選擇應基於項目需求和團隊技術棧。
