Result

مکانیسم اصلی ما برای مدیریت خطا در Rust، فهرست Result است، که به طور خلاصه هنگام بحث در مورد تایپ‌های کتابخانه استاندارد مشاهده کردیم.

use std::fs::File;
use std::io::Read;

fn main() {
    let file: Result<File, std::io::Error> = File::open("diary.txt");
    match file {
        Ok(mut file) => {
            let mut contents = String::new();
            if let Ok(bytes) = file.read_to_string(&mut contents) {
                println!("دفتر خاطرات عزیز: {contents} ({bytes} bytes)");
            } else {
                println!("نمی‌توان محتوای فایل را خواند");
            }
        }
        Err(err) => {
            println!("دفتر خاطرات باز نشد: {err}");
        }
    }
}
This slide should take about 5 minutes.
  • Result has two variants: Ok which contains the success value, and Err which contains an error value of some kind.

  • اینکه آیا یک تابع می‌تواند خطا ایجاد کند یا نه، در signature نوع تابع با برگرداندن تابع مقدار Result کدگذاری می‌شود.

  • مانند Option، هیچ راهی برای فراموش کردن خطا وجود ندارد: شما نمی‌توانید به مقدار موفقیت یا مقدار خطا بدون تطبیق الگوی اولیه در Result دسترسی پیدا کنید تا بررسی کنید کدام نوع را دارید. روش‌هایی مانندunwrap نوشتن کدهای سریع و کثیف را آسان‌تر می‌کنند که مدیریت خطا را به خوبی انجام نمی‌دهد، اما به این معنی است که همیشه می‌توانید در کد منبع خود ببینید که در کجا مدیریت صحیح خطا نادیده گرفته می‌شود.

برای کاوش بیشتر

مقایسه مدیریت خطا در Rust با قراردادهای مدیریت خطا که دانش‌آموزان ممکن است با سایر زبان‌های برنامه‌نویسی آشنا باشند، ممکن است مفید باشد.

استثناها

  • بسیاری از زبان‌ها از exceptionها استفاده می‌کنند، به عنوان مثال. ++C، جاوا، پایتون.

  • در اکثر زبان‌های دارای exception، این که آیا یک تابع می‌تواند استثنا ایجاد کند یا نه، به عنوان بخشی از نوع امضای(signature) آن قابل مشاهده نیست. این به طور کلی به این معنی است که هنگام فراخوانی یک تابع نمی‌توانید بگویید که آیا ممکن است یک exception ایجاد کند یا خیر.

  • استثناها معمولاً call stack را باز می‌کنند و تا رسیدن به بلوک try به سمت بالا منتشر می‌شوند. خطایی که در اعماق call stack ایجاد می‌شود ممکن است بر عملکرد نامرتبط بیشتر تأثیر بگذارد.

شماره‌های خطا

  • برخی از زبان‌ها دارای توابعی هستند که یک عدد خطا (یا مقداری خطای دیگر) را جدا از مقدار بازگشت موفقیت‌آمیز تابع برمی‌گردانند. به عنوان مثال می توان به C و Go اشاره کرد.

  • بسته به زبان ممکن است فراموش کنید مقدار خطا را بررسی کنید، در این صورت ممکن است به یک مقدار موفقیت نامعتبر یا نامعتبر دسترسی داشته باشید.