Spring Boot คือ ตอนที่ 8 : การจัดการข้อยกเว้น (Exception Handling)

  1. ความสำคัญของการจัดการข้อยกเว้น
  2. พื้นฐานของการจัดการข้อยกเว้นใน Java และ Spring Boot
  3. การตั้งค่าแอปพลิเคชัน
  4. การสร้างคลาสข้อยกเว้น (Exception Classes)
  5. การใช้ชั้นบริการ (Implementing the Service Layer)
  6. การจัดการข้อยกเว้นด้วย @ControllerAdvice
  7. การสร้างคอนโทรลเลอร์เลเยอร์ (Controller Layer)

เมื่อทำแอพแทบจะเป็นไปไม่ได้เลยที่จะรับประกันว่าทุกอย่างจะเป็นไปตามแผนที่วางไว้เสมอ ข้อผิดพลาดและข้อยกเว้นเป็นส่วนที่หลีกเลี่ยงไม่ได้ของการพัฒนาซอฟต์แวร์ และการจัดการสถานการณ์เหล่านี้อย่างมีประสิทธิภาพเป็นสิ่งสำคัญในการส่งมอบแอปพลิเคชันที่แข็งแกร่งและเป็นมิตรกับผู้ใช้ ในบทความนี้ เราจะพูดถึงการจัดการข้อยกเว้นใน Spring Boot โดยแนะนำขั้นตอนการทำแอพโดยเฉพาะเพื่อทำความเข้าใจแนวคิดหลักนี้

1. ความสำคัญของการจัดการข้อยกเว้น

คำถามแรกที่เราอาจถามตัวเองคือ ทำไมต้องกังวลกับการจัดการข้อยกเว้น เมื่อเราเขียนโค้ด เราตั้งใจให้โค้ดดำเนินการอย่างราบรื่นและให้ผลลัพธ์ตามที่ต้องการ อย่างไรก็ตาม ในระหว่างการดำเนินการของโปรแกรม อาจมีสถานการณ์ที่ไม่คาดคิด ซึ่งหากไม่มีการจัดการ อาจทำให้แอปพลิเคชันของเราหยุดทำงานหรือแสดงพฤติกรรมที่ไม่พึงประสงค์ บล็อกรหัสที่จัดการกับสถานการณ์ที่ไม่คาดคิดเหล่านี้เรียกว่าตัวจัดการข้อยกเว้น ข้อยกเว้นที่ได้รับการจัดการอย่างดีสามารถให้ข้อเสนอแนะที่เป็นประโยชน์แก่ผู้ใช้ และช่วยให้นักพัฒนาสามารถวินิจฉัยและแก้ไขปัญหาได้อย่างมีประสิทธิภาพมากขึ้น

2. พื้นฐานของการจัดการข้อยกเว้นใน Java และ Spring Boot

ใน Java ข้อยกเว้นคือเหตุการณ์ที่รบกวนการทำงานปกติของคำสั่งของโปรแกรม การจัดการข้อยกเว้น Java จัดการผ่านคำสำคัญห้าคำ: try, catch, throw, throws, finally และ บล็อก try จะล้อมรอบโค้ดที่อาจส่งข้อยกเว้นบล็อก catch จะจับข้อยกเว้น และบล็อก finally จะดำเนินการโดยไม่คำนึงว่าจะมีการส่งข้อยกเว้นหรือไม่

ในบริบทของ Spring Boot เฟรมเวิร์กมีกลไกการจัดการข้อยกเว้นที่ซับซ้อนโดยใช้ @ControllerAdvice และ @ExceptionHandler คำอธิบายประกอบ (annotations)

  • @ControllerAdvice: คำอธิบายประกอบ (annotations) นี้ช่วยให้เราสามารถจัดการข้อยกเว้นทั่วทั้งแอปพลิเคชัน ไม่ใช่แค่ตัวควบคุมแต่ละตัว คุณสามารถคิดว่ามันเป็นตัวสกัดกั้นข้อยกเว้นที่เกิดขึ้นจากวิธีการที่มีคำอธิบาย@RequestMappingประกอบ
  • @ExceptionHandler: คำอธิบายประกอบ (annotations) นี้ใช้เพื่อจัดการกับข้อยกเว้นเฉพาะและส่งการตอบกลับที่กำหนดเองไปยังไคลเอ็นต์

ไปที่ขั้นตอนการทำแอพการจัดการข้อยกเว้นของเรา

3. การตั้งค่าแอปพลิเคชัน

เริ่มต้นด้วยการทำแอพ Spring Boot ใหม่โดยใช้ Spring Initializr คุณจะต้องรวมการขึ้นต่อกันของเว็บเพื่อทำเว็บแอปพลิเคชัน คุณยังสามารถเพิ่มการอ้างอิง Spring Data JPA และ H2 สำหรับการสร้างที่เก็บและฐานข้อมูลในหน่วยความจำ ตามลำดับ หากคุณต้องการคงข้อมูลไว้ในแอปพลิเคชัน

หลังจากตั้งค่าโครงสร้างโครงการแล้ว เราจะสร้างคลาสแบบจำลองสำหรับแอปพลิเคชันของเรา เพื่อความง่าย เราจะสร้างคลาส Book พื้นฐานที่มีฟิลด์ เช่น id, title, author, priceและ

ต่อไป เราจะสร้างอินเทอร์เฟซ BookRepository โดยขยาย JpaRepository สิ่งนี้จะช่วยให้เรามีการดำเนินการ CRUD พื้นฐานสำหรับวัตถุ Book ของเรา

4. การสร้างคลาสข้อยกเว้น (Exception Classes)

ในแอปพลิเคชันของเรา เราจะจัดการกับข้อยกเว้นที่กำหนดเองสองรายการ: BookNotFoundException และ BookAlreadyExistsException ทั้งสองคลาสนี้จะขยายออกไป RuntimeException เราสามารถเพิ่มตัวสร้างให้กับคลาสเหล่านี้ที่ยอมรับข้อความ ซึ่งเราสามารถแสดงได้เมื่อมีการโยนข้อยกเว้น

5. การใช้ชั้นบริการ (Implementing the Service Layer)

ตอนนี้เรามาสร้างคลาส BookService ที่จะจัดการกับตรรกะทางธุรกิจของเรา ในคลาสนี้ เราจะใส่วิธีการ BookRepository สร้างและดึงหนังสือ ของเรา

ในวิธีการ createBook ของเรา ก่อนบันทึกหนังสือ เราสามารถตรวจสอบว่ามีหนังสือชื่อเดียวกันและผู้แต่งอยู่แล้วหรือไม่ ถ้าเป็นเช่นนั้น เราสามารถโยน BookAlreadyExistsException

ในทำนองเดียวกัน ในวิธีการของเรา getBook หากไม่พบหนังสือที่มี ID ที่กำหนด เราสามารถโยนไฟล์ BookNotFoundException

6. การจัดการข้อยกเว้นด้วย @ControllerAdvice

ต่อไป มาสร้างคลาส GlobalExceptionHandler ที่มีคำอธิบายประกอบ (annotations) ด้วย @ControllerAdvice ชั้นนี้จะจัดการตรรกะการจัดการข้อยกเว้นสากลของเรา

ภายในคลาสนี้ เราจะสร้างเมธอดที่มีคำอธิบายประกอบ (annotations) @ExceptionHandler ซึ่งจัดการกับข้อยกเว้นเฉพาะของเรา ตัวอย่างเช่น สำหรับ BookNotFoundException เราสามารถส่งคืน ResponseEntity พร้อมข้อความแสดงข้อผิดพลาดที่กำหนดเองและรหัสสถานะ HTTP สำหรับ ‘Not Found’ (404) สำหรับ BookAlreadyExistsException เราสามารถส่งคืนสถานะ ‘Conflict’ (409)

7. การสร้างคอนโทรลเลอร์เลเยอร์ (Controller Layer)

สุดท้าย เราจะสร้างคลาส BookController ที่เราจะกำหนดจุดสิ้นสุดของเรา เราสามารถสร้างการแมป POST สำหรับสร้างหนังสือและการแมป GET เพื่อดึงหนังสือ ในเมธอดเหล่านี้ เราจะเรียกเมธอด Service Layer ที่เหมาะสม

ตอนนี้ หากคุณพยายามสร้างหนังสือที่มีอยู่แล้วหรือเรียกหนังสือที่ไม่มีอยู่ แอปพลิเคชันของเราจะส่งข้อยกเว้นที่เกี่ยวข้อง และตัวจัดการข้อยกเว้นส่วนกลางของเราจะตรวจจับข้อยกเว้นเหล่านี้และส่งคืนการตอบสนองที่เหมาะสมไปยังไคลเอนต์


จากการทำแอพนี้ เราได้สำรวจความสำคัญและกระบวนการจัดการข้อยกเว้นใน Spring Boot การจัดการข้อยกเว้นที่เหมาะสมเป็นสิ่งสำคัญในการพัฒนาแอปพลิเคชันที่มีประสิทธิภาพและเชื่อถือได้ เนื่องจากช่วยให้นักพัฒนาสามารถจัดการข้อผิดพลาดได้อย่างมีประสิทธิภาพและปรับปรุงประสบการณ์ผู้ใช้โดยการแสดงข้อความแสดงข้อผิดพลาดที่ชัดเจนในการทำแอพ

ด้วยการใช้คำอธิบายประกอบ (annotations) @ControllerAdvice และ @ExceptionHandler Spring Boot ช่วยให้นักพัฒนาสามารถจัดการกับข้อยกเว้นในลักษณะส่วนกลางที่เป็นระเบียบ ปรับปรุงประสิทธิภาพและความสามารถในการอ่านรหัสของคุณ

โปรดจำไว้ว่าในขณะที่เราได้จัดการกับข้อยกเว้นที่กำหนดเองในบทความนี้ หลักการเดียวกันนี้สามารถใช้กับการจัดการข้อยกเว้น Java ที่มีมาให้ได้ การจัดการข้อยกเว้นเป็นหัวข้อกว้างๆ ที่มีความแตกต่างมากมาย ดังนั้น อย่าลืมสำรวจและทดลองต่อไปเพื่อให้เชี่ยวชาญอย่างแท้จริง


Spring Boot คืออะไร

Spring Boot คือ ตอนที่ 7 : เชื่อมต่อฐานข้อมูลด้วย Spring Data JPA
Spring Boot คือ ตอนที่ 9 : การทดสอบหน่วย (Unit Testing) และการทดสอบการรวมเข้าด้วยกัน (Integration Testing)