搜尋
首頁後端開發Golang為了勝利早早退場!

Quitting early for the win!

超簡短摘要:當出現錯誤時退出程式可能是個好主意。使用 gobail 會讓您的生活更輕鬆。

當你的 Go 程式碼出現錯誤時,你通常會看到類似這樣的內容:

您會在這個範例中註意到一些事情:

  1. 您必須檢查是否有錯誤
  2. 有一些文字可以幫助診斷錯誤
  3. 錯誤被包裝,與文字一起傳回

那麼接下來會發生什麼事?好吧,這一切又發生了。您檢查錯誤值,描述它,然後將其傳回。然後一切又重新開始。

我們為什麼要這樣做?為什麼要這麼努力?

這一切都取決於您正在編寫的軟體。當你遇到錯誤時,你必須做出決定。這個錯誤會發生什麼事?

如果您正在編寫一個回應請求的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中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
GO中的接口和多態性:實現代碼可重複使用性GO中的接口和多態性:實現代碼可重複使用性Apr 29, 2025 am 12:31 AM

Interfacesand -polymormormormormormingingoenhancecodereusanity和Maintainability.1)defineInterfaceSattherightabStractractionLevel.2)useInterInterFacesFordEffordExpentIndention.3)ProfileCodeTomeAgePerformancemacts。

'初始化”功能在GO中的作用是什麼?'初始化”功能在GO中的作用是什麼?Apr 29, 2025 am 12:28 AM

initiTfunctioningOrunSautomation beforeTheMainFunctionToInitializePackages andSetUptheNvironment.it'susefulforsettingupglobalvariables,資源和performingOne-timesEtepaskSarpaskSacraskSacrastAscacrAssanyPackage.here'shere'shere'shere'shere'shodshowitworks:1)Itcanbebeusedinanananainapthecate,NotjustAckAckAptocakeo

GO中的界面組成:構建複雜的抽象GO中的界面組成:構建複雜的抽象Apr 29, 2025 am 12:24 AM

接口組合在Go編程中通過將功能分解為小型、專注的接口來構建複雜抽象。 1)定義Reader、Writer和Closer接口。 2)通過組合這些接口創建如File和NetworkStream的複雜類型。 3)使用ProcessData函數展示如何處理這些組合接口。這種方法增強了代碼的靈活性、可測試性和可重用性,但需注意避免過度碎片化和組合複雜性。

在GO中使用Init功能時的潛在陷阱和考慮因素在GO中使用Init功能時的潛在陷阱和考慮因素Apr 29, 2025 am 12:02 AM

initfunctionsingoareAutomationalCalledBeLedBeForeTheMainFunctionandAreuseFulforSetupButcomeWithChallenges.1)executiondorder:totiernitFunctionSrunIndIndefinitionorder,cancancapationSifsUsiseSiftheyDepplothother.2)測試:sterfunctionsmunctionsmunctionsMayInterfionsMayInterferfereWithTests,b

您如何通過Go中的地圖迭代?您如何通過Go中的地圖迭代?Apr 28, 2025 pm 05:15 PM

文章通過GO中的地圖討論迭代,專注於安全實踐,修改條目和大型地圖的性能注意事項。

您如何在GO中創建地圖?您如何在GO中創建地圖?Apr 28, 2025 pm 05:14 PM

本文討論了創建和操縱GO中的地圖,包括初始化方法以及添加/更新元素。

陣列和切片的GO有什麼區別?陣列和切片的GO有什麼區別?Apr 28, 2025 pm 05:13 PM

本文討論了GO中的數組和切片之間的差異,重點是尺寸,內存分配,功能傳遞和用法方案。陣列是固定尺寸的,分配的堆棧,而切片是動態的,通常是堆積的,並且更靈活。

您如何在Go中創建切片?您如何在Go中創建切片?Apr 28, 2025 pm 05:12 PM

本文討論了在GO中創建和初始化切片,包括使用文字,製造功能以及切片現有數組或切片。它還涵蓋了切片語法並確定切片長度和容量。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具