
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 ด้วย
thiserrorcrate เพื่อการ 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 และเทคโนโลยีสมัยใหม่