Error Handling ใน Rust: Result, Option, และการใช้ ? อย่างมีประสิทธิภาพ

Sharing is caring!

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 และเทคโนโลยีสมัยใหม่

Leave a Reply

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *