Anyhow لـ Rust: دليل شامل مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة في Anyhow: ما هو ولماذا تحتاجه

\n\n

Anyhow هي واحدة من أشهر المكتبات لمعالجة الأخطاء في نظام Rust البيئي. توفر طريقة بسيطة ومرنة ومريحة للعمل مع الأخطاء، خاصة في المواقف التي لا تحتاج فيها إلى كتابة صارمة للأخطاء أو عندما تكتب نماذج أولية، أو نصوصًا برمجية، أو أدوات CLI، أو تطبيقات حيث تكون سرعة التطوير مهمة، وليس المعالجة المثالية لكل نوع خطأ.

\n\n

في المكتبة القياسية لـ Rust، تُبنى معالجة الأخطاء حول النوع Result<T, E>، حيث E هو نوع الخطأ. ومع ذلك، في المشاريع الكبيرة، يمكن أن تكون أنواع الأخطاء مختلفة: std::io::Error، serde_json::Error، reqwest::Error، إلخ. دمجها يدويًا مهمة صعبة. تحل Anyhow هذه المشكلة من خلال توفير نوع عام anyhow::Error يمكنه تخزين أي خطأ يطبق trait std::error::Error.

\n\n

المزايا الرئيسية لـ Anyhow:

\n
    \n
  • البساطة: الحد الأدنى من الكود النمطي. لست بحاجة لإنشاء أنواع الأخطاء الخاصة بك لكل وحدة.
  • \n
  • المرونة: يتم تحويل أي خطأ تلقائيًا إلى anyhow::Error.
  • \n
  • السياق: يمكنك إضافة معلومات إضافية إلى الخطأ باستخدام الطريقة .context().
  • \n
  • ماكروات مريحة: bail! و ensure! تسمح بإرجاع الأخطاء بسرعة.
  • \n
  • التوافق: تعمل مع أي مكتبات تُرجع Result.
  • \n
\n\n

Anyhow ليست مخصصة للمكتبات (حيث من الأفضل استخدام thiserror)، لكنها مثالية للتطبيقات والملفات الثنائية والاختبارات.

\n\n

التثبيت

\n\n

Anyhow هي مكتبة لـ Rust، لذا يتم التثبيت عبر مدير الحزم cargo. أضف السطر التالي إلى ملف Cargo.toml الخاص بك:

\n\n
[dependencies]\nanyhow = "1.0"
\n\n

بعد ذلك، نفذ الأمر cargo build، وسيتم تحميل المكتبة وتجميعها. إذا كنت تستخدم Rust 2021 edition أو أحدث، فلا حاجة لأي إعدادات إضافية.

\n\n

للعمل مع Anyhow في الكود، يكفي استيرادها:

\n\n
use anyhow::{Result, anyhow, bail, Context};
\n\n

بداية سريعة: المثال الأول

\n\n

لنكتب برنامجًا بسيطًا يقرأ ملفًا، ويحلله كـ JSON، ويطبع النتيجة. إذا حدث خطأ في أي مرحلة، سنعيده ببساطة إلى الأعلى.

\n\n
use anyhow::Result;\nuse std::fs;\n\nfn main() -> Result<()> {\n    // قراءة محتوى الملف\n    let data = fs::read_to_string("config.json")?;\n    \n    // تحليل كـ JSON (نستخدم serde_json)\n    let config: serde_json::Value = serde_json::from_str(&data)?;\n    \n    println!("التكوين: {}", config);\n    Ok(())\n}
\n\n

لاحظ ? — عامل نشر الخطأ. إذا أعاد read_to_string أو from_str خطأ، فسيتم تحويله تلقائيًا إلى anyhow::Error وستنتهي الدالة بهذا الخطأ. كل شيء بسيط وأنيق.

\n\n

الطرق والوظائف الأساسية لـ Anyhow

\n\n

فيما يلي 10 طرق ووظائف رئيسية لمكتبة Anyhow مع شرح مفصل وأمثلة.

\n\n

1. anyhow!() — إنشاء خطأ مخصص

\n

ما يفعله: الماكرو anyhow! ينشئ خطأ جديدًا من النوع anyhow::Error من سلسلة نصية أو رسالة منسقة. إنه مشابه لـ format!، لكن للأخطاء.

\n

المعلمات: يقبل سلسلة نصية مع تنسيق (مثل format!) أو أي نوع يطبق Display.

\n

مثال:

\n
use anyhow::{anyhow, Result};\n\nfn validate_age(age: i32) -> Result<()> {\n    if age < 0 {\n                    

توصيات