أنواع الاستثناءات المخصّصة
عرّف استثناءاتك الخاصة
أنواع الاستثناءات المخصّصة درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
لماذا الاستثناءات المخصصة؟
يتيح لك تعريف أنواع الاستثناءات الخاصة بك للمتصلين التقاط أخطائك على نحو محدد، وحمل بيانات خاصة بالمجال مع الخطأ.
الاشتقاق من std::exception
اجعل استثناءاتك مشتقة من std::exception (أو من فئة فرعية منه) حتى تتكامل مع المعالجات القياسية وتوفّر الدالة what().
#include <exception>
#include <string>
class ConfigError : public std::exception {
std::string msg;
public:
explicit ConfigError(std::string m) : msg(std::move(m)) {}
const char* what() const noexcept override { return msg.c_str(); }
};رميه والتقاطه
يتصرف نوعك مثل أي استثناء آخر: ارمِه والتقطه بالمرجع.
#include <iostream>
#include <exception>
#include <string>
class ConfigError : public std::exception {
std::string msg;
public:
explicit ConfigError(std::string m) : msg(std::move(m)) {}
const char* what() const noexcept override { return msg.c_str(); }
};
int main() {
try {
throw ConfigError("missing key");
} catch (const ConfigError& e) {
std::cout << e.what() << "\n";
}
}إعادة استخدام الفئات الأساسية القياسية
غالبًا يمكنك الاشتقاق من std::runtime_error أو std::logic_error، إذ يخزّن كلاهما رسالة مسبقًا — وهذا يقلل الشيفرة النمطية.
#include <stdexcept>
#include <string>
class NetworkError : public std::runtime_error {
public:
explicit NetworkError(const std::string& m) : std::runtime_error(m) {}
};حمل بيانات إضافية
يمكن للاستثناءات المخصصة احتواء حقول مثل رمز خطأ أو القيمة التي تسببت في الخطأ، مما يمنح المعالجات سياقًا إضافيًا.
#include <stdexcept>
#include <string>
class HttpError : public std::runtime_error {
public:
int status;
HttpError(int s, const std::string& m)
: std::runtime_error(m), status(s) {}
};الالتقاط باستخدام الفئة الأساسية
بما أن نوعك مشتق من std::exception، يظل بإمكان معالج عام التقاطه عبر المرجع إلى الفئة الأساسية.
#include <iostream>
#include <stdexcept>
class HttpError : public std::runtime_error {
public:
int status;
HttpError(int s, const std::string& m) : std::runtime_error(m), status(s) {}
};
int main() {
try {
throw HttpError(404, "not found");
} catch (const std::exception& e) {
std::cout << e.what() << "\n";
}
}أنشئ هرمية للاستثناءات
جمّع الأخطاء المرتبطة تحت فئة أساسية مشتركة حتى يتمكن المتصلون من التقاط عائلة كاملة أو نوع محدد واحد.
#include <stdexcept>
struct AppError : std::runtime_error { using std::runtime_error::runtime_error; };
struct DbError : AppError { using AppError::AppError; };
struct AuthError: AppError { using AppError::AppError; };حافظ على what() noexcept
أعد تعريف what() بالصيغة const noexcept وأرجع مخزنًا ثابتًا — إذ يجب ألا ترمي الدالة استثناءً أو تعيد مؤشرًا متدليًا.
الرمي بالقيمة
ارمِ كائنات الاستثناء بالقيمة (مثلًا: throw HttpError(500, "x");). ويتولى وقت التشغيل إدارة تخزينها أثناء فك المكدس.
وثّق ما ترميه
اجعل أنواع الاستثناءات في واجهة برمجة التطبيقات جزءًا من عقدها، حتى يعرف المتصلون أي عمليات التقاط يكتبون.
حافظ على البساطة
لا تحتاج معظم المشاريع إلا إلى عدد قليل من أنواع الاستثناءات. ويغطي الاشتقاق من std::runtime_error غالبية الحالات بصورة واضحة.
تحقق سريع
اختبر فهمك للاستثناءات المخصصة.
مراجعة
تعلّمت تعريف أنواع استثناءات مخصصة بالاشتقاق من std::exception أو std::runtime_error، وحمل بيانات إضافية، وبناء هرمية، والحفاظ على what() بصيغة noexcept، والرمي بالقيمة. اجعل مجموعة الأنواع صغيرة وموثّقة.
الأسئلة الشائعة
هل درس «أنواع الاستثناءات المخصّصة» مجاني؟
نعم — نص درس «أنواع الاستثناءات المخصّصة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «أنواع الاستثناءات المخصّصة»؟
عرّف استثناءاتك الخاصة تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «أنواع الاستثناءات المخصّصة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- try وcatch وthrow
- أمان الاستثناءات
- محدّد noexcept
- أنواع الاستثناءات المخصّصة