معالجة الأخطاء في TypeScript: try/catch وما بعدها: من الألف إلى الياء

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

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

ابدأ الدورة

معالجة الأخطاء في TypeScript: من try/catch إلى السيناريوهات المعقدة



TypeScript، كونه طبقة فوق JavaScript، يرث ويوسع آليات معالجة الأخطاء. المعالجة الصحيحة للاستثناءات هي مفتاح تطبيق مستقر ويمكن التنبؤ به. في هذه المقالة، سنقوم بتحليل جميع جوانب العمل مع الأخطاء: من try/catch الأساسي إلى إنشاء فئات الأخطاء المكتوبة الخاصة بنا والاستراتيجيات المتقدمة.



الصيغة الأساسية: try, catch, finally



الآلية الأساسية لمعالجة الأخطاء في TypeScript (كما في JavaScript) هي بنية try...catch...finally. تسمح باعتراض الاستثناءات التي تحدث في الكود والاستجابة لها.



function parseJSON(data: string): object {    try {        return JSON.parse(data);    } catch (error) {        console.error('خطأ في تحليل JSON:', error);        return {};    }}

parseJSON('{"name": "TypeScript"}'); // { name: 'TypeScript' }parseJSON('JSON غير صالح'); // {} (تم اعتراض الخطأ)


يتم تنفيذ كتلة finally في جميع الأحوال - سواء بعد الانتهاء الناجح من try أو بعد اعتراض الخطأ. هذا هو المكان المثالي لتنظيف الموارد (إغلاق الملفات، الاتصالات).



function processData(data: string): void {    let resource: any = null;    try {        resource = acquireResource();        // ... كود خطير    } catch (error) {        console.error('خطأ في المعالجة:', error);    } finally {        if (resource) {            resource.release(); // تنظيف مضمون        }    }}


كتابة الأخطاء: مشكلة unknown



الميزة الرئيسية لـ TypeScript - في كتلة catch، المتغير error افتراضيًا له نوع unknown (بدءًا من TS 4.0). تم ذلك عن قصد لإجبار المطور على التحقق صراحة من نوع الخطأ، بدلاً من افتراض أنه Error.



try {    // بعض الكود} catch (error) {    // error له نوع unknown    // خطأ: الخاصية 'message' غير موجودة في النوع 'unknown'    // console.log(error.message);

// النهج الصحيح - التحقق من النوع if (error instanceof Error) { console.log('الرسالة:', error.message); } else { console.log('خطأ غير معروف:', error); }}


لماذا هذا مهم؟ في JavaScript، يمكن أن يصل إلى كتلة catch أي شيء: سلسلة نصية، رقم، كائن، null أو حتى undefined. التحقق الإجباري من النوع يحمي من الأخطاء أثناء وقت التشغيل.



إنشاء فئات أخطاء مخصصة



للتطبيقات المعقدة، غالبًا ما يكون من الضروري التمييز بين أنواع الأخطاء. في TypeScript، من السهل إنشاء تسلسل هرمي لفئات الأخطاء الخاصة بك، والتي توسع Error المدمج.



// الفئة الأساسية لأخطاء التطبيقclass AppError extends Error {    public readonly statusCode: number;    public readonly isOperational: boolean;

constructor(message: string, statusCode: number = 500, isOperational: boolean = true) { super(message); this.name = this.constructor.name; this.statusCode = statusCode; this.isOperational = isOperational;

// استعادة النموذج الأولي (مهم لـ instanceof) Object.setPrototypeOf(this, new.target.prototype); }}

// أنواع أخطاء محددةclass ValidationError extends AppError { public readonly field: string;

constructor(message: string, field: string) { super(message, 400); this.field = field; }}

class NotFoundError extends AppError { constructor(message: string = 'المورد غير موجود') { super(message, 404); }}

// الاستخدامfunction getUser(id: number): User { if (id <= 0) { throw new ValidationError('يجب أن يكون المعرف رقمًا موجبًا', 'id'); } // ... البحث عن المستخدم throw new NotFoundError

المدونات

توصيات الكتب