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() {
    // זה יגרום לתוכנית להיכנס למצב פאניקה כיוון שכנראה הקובץ לא קיים.
    let _f = File::open("nowhere.txt").unwrap();
}

הרץ אותו, ותראה הודעת פאניקה. התוכנית שלך עוצרת במקומה.

צלילה לעומק

בעבר, טיפול בשגיאות בתכנות היה בלאגן. Rust מקבלת זאת נכון עם הבדלה ברורה בין שגיאות שניתן להתאושש מהן לבין אלו שלא.

האיחוד המפורש Result הוא עבור שגיאות שניתן להתאושש מהן. זה מפורש - אתה מטפל בוריאנט Ok או Err. יש לך גם מתודות כמו unwrap() ו- expect(), אבל הן קיצורי דרך מהירים ומלוכלכים שעלולים להוביל ל- panic!.

panic! היא הדרך של Rust לצעוק שמשהו ממש רע קרה, והיא לא יכולה להתמודד. זה כמו שגיאה שאין מהלהתאושש ממנה שעוצרת את הביצוע מידית. פאניקה ב-Rust לעיתים קרובות מורגשת עם באגים שאינך מצפה לטפל בהם, כמו אינדקס מחוץ לגבולות המערך.

טיפול בשגיאות על ידי החזרת Result הוא המועדף כאשר אתה מצפה להתמודד עם שגיאות. זה Rust אידיומטי, כלומר זה הדרך שמפתחי Rust הסכימו לעשות דברים. יש גם את Option<T>, עבור מקרים שבהם שגיאה היא פשוט משהו שהוא None במקום Some(T). זה הכל על ציפייה ללא צפוי בלי פחד.

אלטרנטיבות? בטח, תוכל להשתמש ב-crates אחרים לטיפול בשגיאות למאפיינים נוספים או שימוש ארגונומי יותר. כמו anyhow לטיפול פשוט בשגיאות, או thiserror לשגיאות בקוד ספרייה.

ראה גם

מעוניין לצלול יותר לעומק? הנה לאן ללכת:

זכור, טיפול טוב בשגיאות אינו רק כתיבת קוד; זה אכפתיות למשתמשי הקוד שלך. פיתוח מהנה!