0Pricing
Learn Rust Coding · درس

تحويل الأخطاء

تطبيقات From

تحويل الأخطاء درس مجاني في Learn Rust Coding على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Learn Rust Coding، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.

لماذا نحوّل الأخطاء؟

تنتج طبقات الشفرة المختلفة أنواعًا مختلفة من الأخطاء. ولتمريرها عبر دالة واحدة، تحتاج إلى تحويل أخطاء المستوى الأدنى إلى نوع موحّد. تنفّذ Rust ذلك من خلال السمة From.

سمة From

تحدّد From<T> كيفية إنشاء نوع من نوع آخر. ويتيح تنفيذها لنوع الخطأ الخاص بك تحويل أخطاء المصدر إليه.

trait From<T> {
    fn from(value: T) -> Self;
}

كيف يستخدم ? سمة From

عند كتابة expr? واختلاف نوع الخطأ عن خطأ الإرجاع في الدالة، يستدعي العامل From::from لتحويله. هذه هي الآلية التي تجعل تمرير الأخطاء سلسًا.

نوع موحّد للأخطاء

عرّف تعدادًا ليحتوي كل نوع من الأخطاء التي قد تُصدرها دالتك.

#[derive(Debug)]
enum AppError {
    Io(std::io::Error),
    Parse(std::num::ParseIntError),
}

تنفيذ From

اكتب تنفيذًا لـFrom لكل خطأ مصدر، بحيث يحوّله إلى المتغيّر المطابق.

impl From<std::io::Error> for AppError {
    fn from(e: std::io::Error) -> Self {
        AppError::Io(e)
    }
}

impl From<std::num::ParseIntError> for AppError {
    fn from(e: std::num::ParseIntError) -> Self {
        AppError::Parse(e)
    }
}

التمرير تلقائيًا

بعد توفير هذه التطبيقات، يحوّل ? كل خطأ إلى AppError تلقائيًا.

fn read_count(path: &str) -> Result<i32, AppError> {
    let text = std::fs::read_to_string(path)?; // io::Error -> AppError
    let n: i32 = text.trim().parse()?;          // ParseIntError -> AppError
    Ok(n)
}

Into هي النظير

يمنحك تنفيذ From<A> for B تلقائيًا القيد A: Into<B>. يُفضّل تنفيذ From؛ وستحصل على into() مجانًا.

fn make() -> AppError {
    let e: std::io::Error = std::io::Error::other("boom");
    e.into() // uses From<io::Error> for AppError
}

تغليف كائنات السمات

لإجراء تحويلات سريعة، يقبل Box<dyn Error> أي نوع من الأخطاء، لأن المكتبة القياسية توفر تطبيقات From عامة للتحويل إليه.

use std::error::Error;

fn run() -> Result<(), Box<dyn Error>> {
    let n: i32 = "42".parse()?; // ParseIntError -> Box<dyn Error>
    println!("{n}");
    Ok(())
}

الحزم التي تنشئ From

كتابة كل تطبيق لـFrom يدويًا أمر ممل. تنشئ سمة #[from] في thiserror هذه التطبيقات، بينما تحوّل anyhow كل شيء إلى نوع واحد تلقائيًا.

اختيار الأسلوب

ملخّص استراتيجيات التحويل:

  • تطبيقات From اليدوية — تحكّم كامل، وشفرة أكثر
  • thiserror #[from] — أخطاء ذات أنواع محددة، وتطبيقات مُنشأة تلقائيًا
  • Box<dyn Error> أو anyhow — أقل قدر من الإجراءات الإضافية

إضافة السياق أثناء التحويل

يمكن لتطبيق From أن يفعل أكثر من مجرد التغليف، إذ يمكنه إثراء الخطأ. يضيف التحويل هنا سياقًا إضافيًا، ما يجعل الخطأ النهائي أكثر إفادة.

impl From<std::num::ParseIntError> for AppError {
    fn from(e: std::num::ParseIntError) -> Self {
        // could log or annotate here before wrapping
        AppError::Parse(e)
    }
}

اختبار سريع

ما السمة التي يستخدمها العامل ? لتحويل نوع من الأخطاء إلى نوع آخر؟

مراجعة

لقد تعلّمت تحويل الأخطاء:

  • يحوّل ? الأخطاء عبر سمة From
  • نفّذ From<Source> لتعداد الأخطاء الخاص بك
  • تمنحك From السمة Into والدالة into() مجانًا
  • يقبل Box<dyn Error> أي خطأ
  • تؤتمت thiserror وanyhow الشفرة المتكررة

الأسئلة الشائعة

هل درس «تحويل الأخطاء» مجاني؟

نعم — نص درس «تحويل الأخطاء» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn Rust Coding، انتقل إلى CoddyKit PRO. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.

ماذا ستتعلم في «تحويل الأخطاء»؟

تطبيقات From تتمرن على Learn Rust Coding مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Learn Rust Coding؟

لا تُشترط خبرة سابقة. Learn Rust Coding على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «تحويل الأخطاء»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Learn Rust Coding هذا؟

نعم. كل درس في Learn Rust Coding يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. Result والمعامل ?
  2. thiserror
  3. anyhow
  4. تحويل الأخطاء
← العودة إلى Learn Rust Coding