[Golang] Let’s custom error like a Gopher
เอาละครับ Gopher ทั้งหลาย หลังจากหายไปนาน ทั้งความขี้เกียจ และอื่นๆ อีกมากมาย แต่วันนี้ได้ดื่ม Craft beer แบบสบายใจจึงเกิดแรงกระตุ้นในการเขียนสาธยายความรู้อีกครั้ง เพื่อไม่เป็นการเสียเวลา ในการร่ายหลายบรรทัด เราก็จะตรงดิ่งเข้าเรื่องเลย
ในการทำงานที่ผ่านมาด้วยการใช้ภาษา Go ชาว Gopher ก็คงจะคุ้นเคยกันดีกับเจ้าตัว error ใน Golang ที่เราต้องรับมือกับมันอย่างหนักหน่วง ด้วยการใช้
if err != nil {
panic(err)
}
อะไรทำนองนี้…… แต่เคยเอะใจกันมั้งไหมว่าการที่เราใช้ error ตัวนี้ เราทำอะไรได้มากกว่านี้ไหม นอกจากการบังคับ error เป็นคำที่เราต้องการ แบบนี้
err := errors.New("This is THE ERROR!!!")
ซึ่งในการพัฒนาและ maintainance code ต่อ มันไม่น่ารักเอาซะเลย มันจะเป็นไปได้ไหมที่เราจะสามารถกำหนด format ของ error ด้วยเราเอง ซึ่งมันก็นำมาสู่หัวข้อนี้
รู้ไหมว่า error type ที่เราๆ ใช้กันอยู่เนี่ย มันเป็น Interface{} นะเว้ยยย
แล้วมันหมายความว่ายังไงละ? มันก็หมายความว่าเราสามารถ เอามันมา implement ได้ยังไงเล่าชาว Gopher
ยังจำเรื่องนี้กันได้อยู่หรือเปล่า [Golang] Pointer receiver and Interface ไม่ได้ก็กลับไปอ่าน อ่านแค่ส่วนหัวข้อ Interface ส่วนล่างก็ได้
สำหรับคนที่ยังจำได้อยู่แล้วกดไปอ่านมาแล้ว ก็จะเข้าใจว่า implement มันง่ายนิดเดียวเพียงแค่เรามี struct ของ error ที่เราอยากจะ custom หรือ ออกแบบ แล้วใช้เป็น Pointer Reciever ให้กับ function Error() ที่เราจะสร้างขึ้นมาใหม่แบบนี้
// LazyError is a lazy error naja
type LazyError struct {
Code string
Message string
}// Error is a function that implement error interface
func (e LazyError) Error() string {
return e.Message
}// New is a function to return erro
func New(text string) error {
return LazyError{Message: text}
}
เพียงเท่านี้เราก็สามารถ handle error ในแบบที่เราต้องการได้แล้ว โดยอยากได้ Error ให้มันออกมาในโครงสร้างไหนก็จัดการได้ตรง struct ที่เราสร้างขึ้นมาได้เลยซึ่งกรณีนี้คือ LazyError นั้นเอง
ยกตัวอย่างการนำไปใช้
เนื่องจากเราสามารถ custom eror ได้ตามที่เราต้องการแล้วถูกไหม นั้นย้อมหมายความว่าเราสามารถเตรียมของจำพวก ข้อความ Error ที่เรามีอยู่แล้ว เตรียมค่าไว้ก่อนแล้วเรียกใช้เมื่อต้องการได้อย่างสบายใจ
หรือแม้กระทั่งใช้เพื่อเอาไปตั้งเป็น Format หลักของการ response API ได้อย่างสบายใจ
ทิ้งท้าย
ตอนแรกนึกว่าเรื่องนี้จะเขียนยาวนะ แต่กลายเป็นว่ามันเป็น Concept ง่ายๆ ที่ไม่ต้องอธิบายเยอะเลย เอาไปปรับใช้กันได้อย่างสบายใจ