توجد أكثر من طريقة للتعامل مع الأخطاء في Rust ، لذا تأكد من مراعاة جميع الخيارات.

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

تعتبر المعالجة الفعالة للخطأ أمرًا بالغ الأهمية في حالة الصدأ. يتيح لك إنشاء تطبيقات قوية وموثوقة يمكنها التعامل مع الأخطاء والإخفاقات غير المتوقعة. تتيح لك آليات معالجة الأخطاء في Rust تطوير برامج مرنة وآمنة يسهل صيانتها.

أنواع أخطاء الصدأ

يحتوي Rust على نظام غني يمكنك استخدامه معالجة الأخطاء بكفاءةحسب أنواعها. لا يمكن التقليل من فوائد نظام Rust الغني من نوع الخطأ مقارنة بأساليب معالجة الأخطاء التقليدية. يوفر نظام نوع الخطأ تحسين نوع السلامةوالتركيب والتعبير وقابلية التصحيح.

فيما يلي قائمة بأنواع الأخطاء الشائعة في Rust:

  • ال std:: io:: Error النوع يمثل أخطاء الإدخال / الإخراج مثل عدم العثور على الملف أو رفض الإذن أو الوصول إلى نهاية الملف.
  • ال std:: num:: ParseIntError النوع يمثل الأخطاء التي تحدث من سلسلة إلى عمليات تحليل عدد صحيح.
  • instagram viewer
  • ال الأمراض المنقولة جنسيا:: الخيار:: NoneError النوع يمثل أخطاء من إلغاء تغليف الخيارات الفارغة.
  • ال الأمراض المنقولة جنسيا:: نتيجة:: نتيجة النوع هو نوع نتيجة عام يمكنك استخدامه لتمثيل أي خطأ.

لكل نوع خطأ مجموعته الخاصة من الأساليب والسمات للتعامل معه بطرق محددة.

في ما يلي مثال على معالجة الأخطاء في Rust لعملية قراءة الملف:

يستخدم الأمراض المنقولة جنسيا:: fs:: ملف ؛
يستخدم الأمراض المنقولة جنسيا:: io:: قراءة ؛

الجبهة الوطنيةإقرا الملف(طريق: &شارع) -> نتيجة<خيط، std:: io:: Error> {
يتركموت ملف = ملف:: فتح (مسار) ؟؛
يتركموت المحتويات = خيط::جديد()؛
file.read_to_string (&موت محتويات)؟؛
نعم(محتويات)
}

ال إقرا الملف تقوم الوظيفة بقراءة محتويات الملف في المسار المحدد وإعادته كسلسلة. تقوم بإرجاع ملف std:: io:: Error إذا فشلت عملية فتح الملف أو قراءته. ال ? ينشر العامل الخطأ ويعيد الخطأ كـ a نتيجة.

آليات معالجة الخطأ في الصدأ

إحدى الميزات الرئيسية التي تساهم في سلامة Rust هي آليات معالجة الأخطاء. توجد أربع آليات رئيسية لمعالجة الأخطاء في Rust: نتيجة اكتب ال خيار اكتب ال ذعر! الماكرو و خطأ سمة.

يسمح نوعا النتائج والخيار بمعالجة الأخطاء المنظمة. يمكنك استخدام الذعر! ماكرو لمعالجة الأخطاء غير القابلة للاسترداد. تتيح لك سمة الخطأ تحديد أنواع الأخطاء المخصصة ومعالجة الأخطاء المخصصة.

نوع النتيجة

ال نتيجة النوع هو نوع مضمن يمثل نتيجة العملية التي يمكن أن تفشل. لها نوعان مختلفان: نعم المتغير ، الذي يمثل النجاح ويحتوي على قيمة ، و خطأ، الذي يمثل الفشل ويحتوي على قيمة خطأ.

إليك كيفية استخدام نوع النتيجة لفتح ملف وقراءة محتوياته:

يستخدم الأمراض المنقولة جنسيا:: fs:: ملف ؛
يستخدم الأمراض المنقولة جنسيا:: io:: مقدمة:: * ؛

الجبهة الوطنيةإقرا الملف(مسار الملف: &شارع) -> نتيجة<خيط، std:: io:: Error> {
يتركموت file = File:: open (file_path) ؟؛
يتركموت المحتويات = خيط::جديد()؛
file.read_to_string (&موت محتويات)؟؛
نعم(محتويات)
}

الجبهة الوطنيةرئيسي() {
يترك النتيجة = read_file ("file.txt");

مباراة نتيجة {
نعم(المحتويات) => println!("{}"، محتويات)،
خطأ(هـ) => println!("خطأ: {}"، ه) ،
}
}

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

نوع الخيار

ال خيار النوع هو نوع مضمن يمثل وجود قيمة أو غيابها. ال خيار النوع له متغيرين. بعض يمثل قيمة ، و لا أحد يمثل عدم وجود قيمة.

إليك كيف يمكنك استخدام خيار اكتب لاسترداد العنصر الأول من المتجه.

الجبهة الوطنيةget_first_elementاستنساخ> (vec: Vec) -> خيار {
لو vec.is_empty () {
لا أحد
} آخر {
بعض(vec.first (). unsrap (). clone ())
}
}

الجبهة الوطنيةرئيسي() {
يترك vec = vec![1, 2, 3];
يترك النتيجة = get_first_element (vec) ؛

مباراة نتيجة {
بعض(عنصر) => println!("{}"، عنصر)،
لا أحد => println!("المتجه فارغ."),
}
}

ال get_first_element ترجع الدالة خيار يكتب. إذا كان المتجه فارغًا ، ترجع الدالة لا أحد; وإلا ، ترجع الوظيفة بعض تحتوي على العنصر الأول من المتجه. في ال رئيسي وظيفة مباراة بيان يعالج ال خيار قيمة. إذا كان خيار بتقييم بعض، تقوم الوظيفة بطباعة العنصر الأول. خلاف ذلك ، تقوم الوظيفة بطباعة رسالة تشير إلى أن المتجه فارغ.

الذعر! دقيق

ال ذعر! يوفر الماكرو وظائف لمعالجة الأخطاء التي لا يمكن إصلاحها في Rust. عند استدعاء ذعر! الماكرو ، فإنه يطبع رسالة خطأ وينهي البرنامج.

هذا مثال على استخدام الذعر! ماكرو للإشارة إلى أن الدالة بها وسيطات غير صالحة.

الجبهة الوطنيةيقسم(توزيعات ارباح: f64، المقسوم عليه: f64) -> f64 {
لو المقسوم عليه == 0.0 {
ذعر!("لا يمكن للمقسوم عليه أن يكون صفراً.");
}

المقسوم / المقسوم
}

الجبهة الوطنيةرئيسي() {
يترك النتيجة = قسمة (4.0, 0.0);
println!("{}"، نتيجة)؛
}

ال يقسم تتحقق الوظيفة مما إذا كان المقسوم عليه صفر ؛ إذا كان المقسوم عليه صفرًا ، تستدعي الدالة ذعر! ماكرو مع رسالة خطأ ؛ وبخلاف ذلك ، تقوم الوظيفة بحساب النتيجة وإرجاعها

ال رئيسي تستدعي دالة دالة القسمة مع وسيطات غير صالحة لتشغيل ذعر! دقيق.

ها هي رسالة الخطأ:

سمة الخطأ

ال خطأ السمة هي سمة مضمنة تحدد سلوك أنواع الخطأ. ال خطأ توفر السمة وظائف لتحديد أنواع الأخطاء المخصصة ومعالجة الأخطاء المخصصة.

فيما يلي مثال على تحديد نوع خطأ مخصص يمثل خطأ لم يتم العثور على الملف.

يستخدم الأمراض المنقولة جنسيا:: خطأ:: خطأ؛
يستخدم الأمراض المنقولة جنسيا:: fmt ؛
يستخدم الأمراض المنقولة جنسيا:: io:: قراءة ؛

# [اشتقاق (تصحيح)]
هيكللم يتم العثور على الملف(خيط);

ضمني fmt:: عرض ل لم يتم العثور على الملف {
الجبهة الوطنيةFMT(&الذات، F: &موت fmt:: منسق) -> fmt ::نتيجة {
يكتب!(F، "لم يتم العثور على الملف: {}", الذات.0)
}
}

ضمني خطأ ل لم يتم العثور على الملف {}

الجبهة الوطنيةإقرا الملف(مسار الملف: &شارع) -> نتيجة<خيط, صندوق<دين خطأ >> {
يتركموت file = std:: fs:: File:: open (file_path) .map_err (| e | FileNotFound (شكل!("{}"، ه)))؟
يتركموت المحتويات = خيط::جديد()؛
file.read_to_string (&موت محتويات)؟؛
نعم(محتويات)
}

الجبهة الوطنيةرئيسي() {
يترك النتيجة = read_file ("file.txt");

مباراة نتيجة {
نعم(المحتويات) => println!("{}"، محتويات)،
خطأ(هـ) => println!("خطأ: {}"، ه) ،
}
}

نوع الخطأ المخصص هو لم يتم العثور على الملف هيكل. النوع يحتوي على مسار ملف و لم يتم العثور على الملف النوع ينفذ ال عرض السمة لإرجاع رسائل الخطأ سهلة الاستخدام و خطأ سمة للإشارة إلى أن هذا هو نوع خطأ.

في ال إقرا الملف وظيفة لم يتم العثور على الملف نوع الخطأ يمثل خطأ لم يتم العثور على الملف ، و map_err طريقة تحويل std:: io:: Error إلى خطأ FileNotFound. أخيراً، الصندوق يسمح النوع للوظيفة بإرجاع أي نوع يقوم بتنفيذ سمة الخطأ.

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

إليك نتيجة ملف غير موجود:

يمكنك الاعتماد على نموذج ملكية Rust لأمان البرنامج

إلى جانب آلية معالجة الأخطاء الرائعة في Rust ، يستخدم Rust أيضًا نموذج ملكية يساعد على ضمان أن تكون برامجك آمنة للذاكرة.

يضمن Rust قواعد الملكية مع مدقق الاستعارة في وقت التجميع قبل تشغيل البرنامج.