Go語言學習筆記 - PART12 - 異常處理機制與單元測試

小羅希冀發表於2019-05-08

Go中的異常處理機制

  • Go沒有Java那樣的try/catch機制,不能向上丟擲異常,但是有自己的一套defer - panic - recover機制
  • try/catch機制從底層往高層丟擲異常耗費資源
  • Go中處理錯誤是通過在函式和方法中返回錯誤物件作為它們唯一或者最後一個返回值,如果返回nil,表示沒有錯誤

panic - recover來處理異常

  • recover函式用於從panic或錯誤場景中恢復,可以讓程式從panicking重新獲取控制權,停止終止程式的過程,恢復程式正常執行

類似於Java的catch程式碼塊

  • recover只能在defer修飾的函式中使用,用於獲取panic呼叫中傳遞的錯誤值(在別的地方呼叫,返回nil)
  • panic會導致方法呼叫棧被展開,直到defer修飾的recover()被呼叫或者程式終止

自定義包中的異常處理

  • 在包內部,總是應該從panic中recover,不允許顯示地超出包範圍的panic()
  • 應該向包的呼叫者返回錯誤值,而不是panic

通過閉包處理錯誤

defer - panic - recover機制 + 閉包,可以提供一種更加優雅的方式處理錯誤(僅適用於所有函式都是同一種簽名

func errorHandler(fn fType1) fType1 {
	return func(a type1, b type2) {
		defer func() {
			if err, ok := recover().(error); ok {
				log.Printf("run time panic: %v", err)
			}
		}()
		fn(a, b)
	}
}
複製程式碼

單元測試

  • 測試程式必須屬於被測試的包,並且檔名滿足*_test.go
  • 測試程式不會被普通的Go編譯器編譯,可以通過gotest編譯普通程式和測試程式
  • 測試程式必須匯入“testing”包,測試程式內,函式名字為"TestZzz"形式

如:TestFmtInterface,TestPayEmployees等

  • 測試函式的形式:func TestAbcde(t *testing.T)

T 是傳給測試函式的結構型別,用來管理測試狀態,支援格式化測試日誌,如 t.Log,t.Error,t.ErrorF 等

  • 測試失敗可呼叫函式
    • func (t *T) Fail() 標記測試函式為失敗,然後執行餘下測試
    • func (t *T) FailNow() 標記測試函式為失敗並且中止執行;檔案內的其他測試函式也會被略過,繼續執行下一個檔案的測試函式
    • func (t *T) Log(args ...interface{}) 列印錯誤日誌
    • func (t *T) Fatal(args ...interface{}) 相當於限制性Log(),然後執行FailNow()

分析優化

使用gotest,通過引數 -cpuprofile 和 -memprofile可以向指定檔案寫入CPU和記憶體使用情況

go test -x -v -cpuprofile=prof.out -file x_test.go

入門教程推薦: github.com/Unknwon/the…

相關文章