كورس C++ المتقدم – الحلقة الثانية: Exception Handling (معالجة الأخطاء)
#برمجة
مقدمة
مرحباً بك في الحلقة الثانية من المستوى المتقدم في C++.
في الحلقة السابقة تعلمنا:
- Templates
- Function Templates
- Class Templates
- أساسيات الكود العام (Generic Programming)
اليوم سندخل موضوع مهم جداً في أي برنامج احترافي:
Exception Handling
أي معالجة الأخطاء أثناء تشغيل البرنامج.
لماذا نحتاج Exception Handling؟
تخيل برنامج آلة حاسبة:
int a = 10;
int b = 0;
cout << a / b;
المشكلة
قسمة على صفر!
هذا خطأ خطير وقد يؤدي إلى:
- توقف البرنامج
- Crash
- سلوك غير متوقع
الطريقة التقليدية (الخاطئة أحياناً)
if(b != 0)
{
cout << a / b;
}
else
{
cout << "Error";
}
✔ تعمل
❌ لكنها ليست قوية في البرامج الكبيرة
الحل الاحترافي: Exception Handling
الكلمات الأساسية
| الكلمة | الوظيفة |
|---|---|
| try | جرب تنفيذ الكود |
| catch | التقط الخطأ |
| throw | أطلق الخطأ |
الشكل العام
try
{
// code
}
catch(...)
{
// error handler
}
مثال بسيط
#include <iostream>
using namespace std;
int main()
{
try
{
int a = 10;
int b = 0;
if(b == 0)
{
throw "Division by zero error";
}
cout << a / b;
}
catch(const char* msg)
{
cout << "Error: " << msg;
}
return 0;
}
الناتج
Error: Division by zero error
كيف تعمل try و catch؟
- try → ينفذ الكود
- إذا حصل خطأ → ينتقل مباشرة إلى catch
- البرنامج لا يتوقف
مثال عملي أقوى
إدخال مستخدم
#include <iostream>
using namespace std;
int main()
{
try
{
int age;
cout << "Enter age: ";
cin >> age;
if(age < 0)
{
throw "Age cannot be negative";
}
cout << "Age is: " << age;
}
catch(const char* msg)
{
cout << "Error: " << msg;
}
return 0;
}
أنواع throw
يمكنك رمي:
نص
throw "Error message";
رقم
throw 404;
float
throw 3.14;
catch متعددة
try
{
throw 404;
}
catch(int code)
{
cout << "Error code: " << code;
}
catch(...)
{
cout << "Unknown error";
}
catch (...) يعني ماذا؟
يعني:
أي خطأ مهما كان نوعه
مثال كامل متعدد الأخطاء
#include <iostream>
using namespace std;
int main()
{
try
{
int x = 5;
if(x == 5)
throw 500;
if(x < 0)
throw "Negative value";
}
catch(int code)
{
cout << "Error Code: " << code;
}
catch(const char* msg)
{
cout << "Message: " << msg;
}
catch(...)
{
cout << "Unknown error";
}
return 0;
}
إنشاء Exception مخصص
يمكنك إنشاء كلاس خاص بالأخطاء.
مثال
#include <iostream>
using namespace std;
class MyException
{
public:
string message;
MyException(string msg)
{
message = msg;
}
};
الاستخدام
try
{
throw MyException("Custom Error");
}
catch(MyException e)
{
cout << e.message;
}
مثال احترافي: آلة حاسبة آمنة
#include <iostream>
using namespace std;
int main()
{
try
{
int a, b;
cout << "Enter A: ";
cin >> a;
cout << "Enter B: ";
cin >> b;
if(b == 0)
{
throw "Cannot divide by zero";
}
cout << "Result: " << a / b;
}
catch(const char* msg)
{
cout << "Error: " << msg;
}
return 0;
}
لماذا Exception مهم؟
✔ يمنع انهيار البرنامج
✔ يجعل البرامج احترافية
✔ يستخدم في جميع المكتبات الكبيرة
✔ أساسي في الأنظمة الحقيقية
مثال من الحياة الواقعية
تخيل تطبيق بنك:
- إدخال رقم حساب خاطئ
- رصيد غير كافي
- اتصال مفقود
كلها تُعالج بـ Exceptions
الفرق بين if و try/catch
| if | try/catch |
|---|---|
| بسيط | احترافي |
| محدود | قوي جداً |
| لا يغطي كل الحالات | يغطي كل الأخطاء |
أخطاء شائعة
❌ نسيان catch
❌ رمي خطأ بدون معالجة
throw 10;
بدون catch
❌ استخدام try بدون داعي
تمرين 1
اصنع برنامج يقسم رقمين مع معالجة الخطأ.
تمرين 2
تحقق من العمر (لا يقبل سالب).
تمرين 3
أنشئ Exception مخصص للرصيد البنكي.
تمرين 4
استخدم catch متعددة الأنواع.
تمرين 5
اصنع نظام تسجيل دخول يتحقق من:
- اسم المستخدم
- كلمة المرور
ويعالج الأخطاء باستخدام try/catch.
ملخص الحلقة الثانية
تعلمنا:
- try
- catch
- throw
- معالجة الأخطاء
- منع انهيار البرامج
- Exception متعددة الأنواع
- Exception مخصص
- تطبيقات عملية
في الحلقة الثالثة من المستوى المتقدم سنتعلم:
🔥 Smart Pointers
وسنتعرف على:
- unique_ptr
- shared_ptr
- weak_ptr
- إدارة الذاكرة تلقائياً
- بديل حديث لـ new و delete
- كتابة برامج آمنة بدون Memory Leaks 🚀

تعليقات
إرسال تعليق