0Pricing
Learn Rust Coding · درس

anyhow

أخطاء مرنة للتطبيقات

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

أخطاء التطبيقات المرنة

في شيفرة التطبيقات، غالبًا ما تريدون فقط تمرير الأخطاء إلى الأعلى مع إضافة السياق، من دون تعريف تعداد محدد النوع لكل خطأ. توفر حزمة anyhow نوع خطأ واحدًا سهل الاستخدام لهذا الغرض.

إضافة anyhow

أضيفوها كتَبعية. وهي تتكامل جيدًا مع thiserror: استخدموا thiserror للمكتبات وanyhow للملفات التنفيذية.

[dependencies]
anyhow = "1.0"

الاسم المستعار anyhow::Result

يمثل anyhow::Result<T> اختصارًا لـ Result<T, anyhow::Error>. ويمكن لنوع Error احتواء أي خطأ يطبق std::error::Error.

use anyhow::Result;

fn load() -> Result<String> {
    let text = std::fs::read_to_string("config.txt")?;
    Ok(text)
}

التحويل التلقائي

يحوّل العامل ? أي خطأ قياسي تلقائيًا إلى anyhow::Error، ولذلك يمكنكم مزج أنواع الأخطاء بحرية.

use anyhow::Result;

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

إضافة السياق

تضيف الدالة .context() رسالة سهلة الفهم إلى الخطأ، فتنشئ سلسلة واضحة عند حدوث الفشل.

use anyhow::{Context, Result};

fn read_config(path: &str) -> Result<String> {
    let text = std::fs::read_to_string(path)
        .context("failed to read config file")?;
    Ok(text)
}

السياق الكسول

استخدموا with_context عندما يكون إنشاء الرسالة مكلفًا أو يحتاج إلى بيانات وقت التشغيل؛ إذ لا يُنفذ الإغلاق إلا عند حدوث خطأ.

use anyhow::{Context, Result};

fn open(path: &str) -> Result<String> {
    std::fs::read_to_string(path)
        .with_context(|| format!("could not open {path}"))
}

إنشاء أخطاء فورية

تنشئ macro anyhow! خطأً من رسالة، بينما تعيد bail! خطأً مبكرًا.

use anyhow::{anyhow, bail, Result};

fn check(age: i32) -> Result<()> {
    if age < 0 {
        bail!("age cannot be negative");
    }
    if age > 150 {
        return Err(anyhow!("age {age} is implausible"));
    }
    Ok(())
}

استخدام ensure!

تعمل ensure! مثل assert!، لكنها تعيد خطأً بدلًا من التسبب في panic.

use anyhow::{ensure, Result};

fn divide(a: i32, b: i32) -> Result<i32> {
    ensure!(b != 0, "division by zero");
    Ok(a / b)
}

استخدام anyhow في main

أعيدوا anyhow::Result<()> من main للحصول على سلاسل أخطاء منسقة جيدًا تُطبع عند الفشل.

use anyhow::Result;

fn main() -> Result<()> {
    let text = std::fs::read_to_string("data.txt")?;
    println!("{text}");
    Ok(())
}

فحص السبب

رغم أن anyhow::Error مبهم، يمكنكم فحصه مع ذلك. تستعيد downcast_ref نوع خطأ ملموسًا عند الحاجة إلى اتخاذ فرع بناءً عليه.

use anyhow::Result;

fn report(err: anyhow::Error) {
    if let Some(io) = err.downcast_ref::<std::io::Error>() {
        println!("io error: {io}");
    } else {
        println!("other error: {err}");
    }
}

thiserror مقابل anyhow

قاعدة عامة:

  • thiserror — للمكتبات والأخطاء المحددة النوع التي يطابق عليها المتصلون
  • anyhow — للتطبيقات، لمجرد تمرير الأخطاء مع السياق

يمكنكم تحويل خطأ thiserror إلى anyhow بسلاسة باستخدام ?.

اختبار سريع

ما دالة anyhow التي تضيف رسالة وصفية إلى الخطأ أثناء تمريره؟

مراجعة

لقد تعلّمت حزمة anyhow:

  • تستخدم anyhow::Result<T> نوعًا واحدًا مرنًا للأخطاء
  • يحوّل ? أي خطأ قياسي تلقائيًا
  • تضيف .context() / with_context() رسائل واضحة
  • تنشئ anyhow! وbail! وensure! أخطاءً
  • مناسبة أكثر لشفرة التطبيقات (الملفات التنفيذية)

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

هل درس «anyhow» مجاني؟

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

ماذا ستتعلم في «anyhow»؟

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

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

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

كم من الوقت يستغرق درس «anyhow»؟

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

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

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

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

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