
Rust เป็นหนึ่งในภาษาที่ออกแบบระบบการจัดการข้อผิดพลาดไว้อย่างชาญฉลาด ผ่าน Enum อย่าง Result
และ Option
ซึ่งช่วยให้โค้ดปลอดภัยจาก panic ได้มากขึ้น ในบทความนี้เราจะลงลึกถึงการใช้งาน และการใช้เครื่องหมาย ?
เพื่อให้จัดการข้อผิดพลาดได้อย่างมีประสิทธิภาพ
Option และความหมาย
Option
เป็น enum ที่ใช้สำหรับค่าที่อาจจะมีหรือไม่มีค่าเลย ตัวอย่าง:
fn get_username(id: u32) -> Option<String> { if id == 1 { Some(String::from("admin")) } else { None } }
การใช้ match
เพื่อตรวจสอบค่าของ Option:
match get_username(1) { Some(name) => println!("User: {}", name), None => println!("No user found"), }

Result และการจัดการ Error
Result
ใช้สำหรับสถานการณ์ที่อาจเกิดข้อผิดพลาดได้ และต้องการส่งกลับค่า error หรือผลลัพธ์
use std::fs::File; fn read_file(filename: &str) -> Result<String, std::io::Error> { let mut file = File::open(filename)?; let mut content = String::new(); use std::io::Read; file.read_to_string(&mut content)?; Ok(content) }
โค้ดข้างบนใช้ ?
เพื่อ propagate error อย่างสั้นกระชับ

การใช้เครื่องหมาย ?
อย่างมีประสิทธิภาพ
- ใช้กับฟังก์ชันที่ return
Result
หรือOption
- ทำให้โค้ดสั้นลง และ readable มากขึ้น
- ใช้กับการเรียก chain function ที่อาจ error เช่น I/O, network
fn example() -> Result<(), String> { let val = do_something()?; let processed = process(val)?; println!("Success"); Ok(()) }
เปรียบเทียบ: unwrap
vs ?
Method | ข้อดี | ข้อเสีย |
---|---|---|
unwrap() | เขียนสั้น ใช้ใน testing ได้เร็ว | panic ทันทีเมื่อเจอ None หรือ Err |
? | propagate error ขึ้น caller layer | ต้องใช้ในฟังก์ชันที่รองรับ Result/Option |
Best Practices
- หลีกเลี่ยง
unwrap
บน production - ใช้
?
กับฟังก์ชันย่อย แล้ว handle error ชั้นนอก - แยก error ด้วย
thiserror
crate เพื่อการ debug ที่ดีขึ้น
use thiserror::Error; #[derive(Error, Debug)] enum MyError { #[error("File error: {0}")] Io(#[from] std::io::Error), #[error("Parse error: {0}")] Parse(#[from] std::num::ParseIntError), }
บทสรุป
การจัดการ error ใน Rust มีเครื่องมือให้เลือกใช้หลากหลาย ตั้งแต่ Option
, Result
, unwrap
, ไปจนถึงเครื่องหมาย ?
และการใช้ thiserror
เพื่อ custom error ให้เหมาะสมกับระบบของคุณ การเขียนให้ robust และ readable ขึ้นอยู่กับความเข้าใจในระบบ error เหล่านี้
บทความโดย poolsawat.com – แชร์ความรู้ Rust และเทคโนโลยีสมัยใหม่