Rust:
การจัดการกับข้อผิดพลาด

วิธีการ:

Rust จัดการกับข้อผิดพลาดในสองวิธีหลัก: ข้อผิดพลาดที่สามารถแก้ไขได้และไม่สามารถแก้ไขได้ มาดูทั้งสองแบบกัน

ข้อผิดพลาดที่สามารถแก้ไขได้ใช้ Result<T, E>:

use std::fs::File;

fn open_file(filename: &str) -> Result<File, std::io::Error> {
    let f = File::open(filename);
    
    match f {
        Ok(file) => Ok(file),
        Err(e) => Err(e),
    }
}

fn main() {
    match open_file("hello.txt") {
        Ok(_file) => println!("ไฟล์เปิดสำเร็จ."),
        Err(_e) => println!("การเปิดไฟล์ล้มเหลว."),
    }
}

ผลลัพธ์อาจเป็น “ไฟล์เปิดสำเร็จ.” หรือ “การเปิดไฟล์ล้มเหลว.” ขึ้นอยู่กับ hello.txt ของคุณ

สำหรับข้อผิดพลาดที่ไม่สามารถแก้ไขได้ เราใช้ panic!:

fn main() {
    // สิ่งนี้จะทำให้โปรแกรม panic เพราะไฟล์อาจไม่มีอยู่จริง
    let _f = File::open("nowhere.txt").unwrap();
}

รันมัน และคุณจะเห็นข้อความ panic โปรแกรมของคุณหยุดนิ่งทันที

การดำดิ่งลึก

โดยประวัติศาสตร์ การจัดการกับข้อผิดพลาดในการเขียนโปรแกรมเป็นเรื่องยุ่งยาก Rust ทำให้ถูกต้องด้วยการแยกแยะชัดเจนระหว่างข้อผิดพลาดที่สามารถแก้ไขได้และไม่สามารถแก้ไขได้

อีนัม Result ใช้สำหรับข้อผิดพลาดที่สามารถแก้ไขได้ มันชัดเจน - คุณจัดการกับตัวแปร Ok หรือ Err คุณมีเมทอดเช่น unwrap() และ expect() ด้วย แต่พวกมันเป็นทางลัดที่รวดเร็วและสกปรกซึ่งสามารถนำไปสู่ panic!

panic! เป็นวิธีของ Rust ในการบอกว่าเกิดเหตุการณ์ที่ไม่ดีมากๆ ขึ้น และมันไม่สามารถจัดการได้ เหมือนกับข้อผิดพลาดที่ไม่สามารถแก้ไขได้ซึ่งหยุดการทำงานทันที การ panic ใน Rust มักเกิดขึ้นกับบักที่คุณไม่คาดคิดว่าจะจัดการได้ เช่น การอ้างถึงนอกขอบเขตของอาร์เรย์

การจัดการข้อผิดพลาดโดยการคืนค่า Result ได้รับการต้อนรับเมื่อคุณคาดหวังว่าจะต้องจัดการกับข้อผิดพลาด มันเป็นวิธีที่โปรแกรมเมอร์ Rust ตกลงกัน เช่นเดียวกันกับ Option<T> สำหรับกรณีที่ข้อผิดพลาดเป็นเพียงบางสิ่งที่เป็น None แทนที่จะเป็น Some(T) มันเกี่ยวกับการคาดหวังสิ่งที่ไม่คาดคิดโดยไม่มีความกลัว

ทางเลือก? แน่นอน คุณสามารถใช้คลังการจัดการข้อผิดพลาดอื่นๆ ได้สำหรับคุณสมบัติเพิ่มเติมหรือการใช้งานที่สะดวกขึ้น เช่น anyhow สำหรับการจัดการข้อผิดพลาดอย่างง่าย หรือ thiserror สำหรับข้อผิดพลาดในโค้ดไลบรารี

ดูเพิ่มเติม

สนใจที่จะศึกษาลึกขึ้นไหม? นี่คือที่ที่คุณควรไป:

จำไว้ว่า การจัดการข้อผิดพลาดที่ดีไม่ใช่เพียงแค่การเขียนโค้ด; มันคือการดูแลผู้ใช้โค้ดของคุณ การเขียนโค้ดอย่างมีความสุข!