[Golang] Let’s custom error like a Gopher

Visarut Junsone
Lazy-Dev
Published in
2 min readNov 15, 2019

เอาละครับ 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 ง่ายๆ ที่ไม่ต้องอธิบายเยอะเลย เอาไปปรับใช้กันได้อย่างสบายใจ

--

--

Visarut Junsone
Lazy-Dev

I’m Full-Stack Developer. ReactJS Golang C# Javascript C++ PHP and learning a lot more. Not lazy as it name. “Lazy-Dev”