JavaScript: الأخطاء والتصحيح في JavaScript
آخر تحديث: 2026-10-13
كتابة كود خالٍ من الأخطاء مستحيل — حتى مبتكر JavaScript أنتج خطأ typeof null === "object" في 10 أيام فقط. لذا تعلم العثور على الأخطاء ومعالجتها أهم من تعلم كتابة الكود.
1. معالجة الأخطاء والتصحيح
| نوع الخطأ | السبب | مثال |
|---|---|---|
SyntaxError |
صيغة غير صالحة | if (true { — أقواس غير متطابقة |
ReferenceError |
الوصول إلى متغير غير موجود | console.log(notExist) |
TypeError |
العمل على نوع خاطئ | undefined.toString() |
RangeError |
القيمة خارج النطاق الصالح | new Array(-1) |
SyntaxError يُ catch قبل تنفيذ الكود (مرحلة التحليل). الأخطاء الأخرى هي أخطاء وقت التشغيل.
(2) try...catch...finally
استخدم try...catch ل catch أخطاء الوقت التشغيل ومنع تعطل برنامجك:
<script>
try {
const data = JSON.parse('{bad json}');
} catch (error) {
console.log("فشل التحليل:", error.message);
} finally {
console.log("عملية التنظيف");
}
</script>
كائن error في catch لديه خاصيتان مستخدمتان بشكل شائع:
error.message— وصف الخطأerror.name— اسم نوع الخطأ
(3) throw — إلقاء الأخطاء يدوياً
try...catch يمكنه فقط catch أخطاء الوقت التشغيل، لكن أخطاء المنطق التجاري تحتاج إلى إلقائها يدوياً:
<script>
function setAge(age) {
if (typeof age !== "number" || age < 0) {
throw new Error("العمر يجب أن يكون رقماً موجباً");
}
console.log("تم تعيين العمر إلى: " + age);
}
try {
setAge(-5);
} catch (e) {
console.log(e.message);
}
</script>
throw يمكن أن تلقي أي قيمة، لكن يُنصح باستخدام new Error() أو فرعياتها — تتضمن معلومات تتبع المكدس.
(4) رسائل الأخطاء المخصصة
استخدم فرعيات Error أو خصائص مخصصة لتوفير معلومات أكثر ثراءً عن الأخطاء:
<script>
class ValidationError extends Error {
constructor(field, message) {
super(message);
this.name = "ValidationError";
this.field = field;
}
}
try {
throw new ValidationError("email", "تنسيق بريد إلكتروني غير صالح");
} catch (e) {
console.log(e.name + " [" + e.field + "]: " + e.message);
}
</script>
(5) أدوات المتصفح (F12)
| اللوحة | الغرض |
|---|---|
| Console | عرض السجلات، تنفيذ الكود، رؤية الأخطاء |
| Sources | تعيين نقاط توقف، تنفيذ سطر بسطر، فحص المتغيرات |
| Network | فحص طلبات الشبكة، حالة الاستجابة، أوقات التحميل |
| Elements | عرض/تعديل DOM والأنماط |
تصحيح نقاط التوقف هو أقوى تقنية تصحيح: انقر على رقم السطر في لوحة Sources لتعيين نقطة توقف، حدث الصفحة، يتوقف الكود عند تلك النقطة — تنفيذ سطر بسطر، فحص المتغيرات، وفحص مكدس الاتصال.
(6) عائلة console
| الطريقة | الغرض |
|---|---|
console.log() |
إخراج عام |
console.warn() |
تحذير (أصفر) |
console.error() |
خطأ (أحمر) |
console.table() |
عرض المصفوفات/الكائنات كجدول |
console.time() / console.timeEnd() |
قياس الوقت |
console.group() / console.groupEnd() |
إخراج مجمع |
console.clear() |
مسح وحدة التحكم |
console.table مفيد بشكل خاص لعرض مصفوفات الكائنات — أكثر قابلية للقراءة من log.
(7) نصائح التحيح
- تعليق النصف: علّق نصف الكود، انظر أي نصف فيه المشكلة، وضيقها خطوة بخطوة
- console.log في كل مكان: اطبع قيم المتغيرات في النقاط المهمة — بدائي لكن فعال
- تصحيح نقاط التوقف: أقوى من
console.log— أوقف التنفيذ وعدّل المتغيرات في الوقت الفعلي - تصحيح البطة المطاطية: اشرح الكود سطر بسطر لبطة مطاطية (أو زميل). غالباً، ستجد الخطأ في منتصف الشرح.
▶ مثال: try/catch لتحليل JSON
▶ جرّب الكود▶ مثال: أخطاء مخصصة والتحقق من النماذج
▶ جرّب الكود▶ مثال: مرجع سريع لأنواع الأخطاء وطرق console
▶ جرّب الكود❓ أسئلة شائعة
SyntaxError تُطرح أثناء مرحلة التحليل قبل بدء التنفيذ، لذا بلوك try لا يصل أبداً. ومع ذلك، إذا حدث SyntaxError وقت التشغيل (مثل فشل JSON.parse، أو new Function("bad syntax"))، يمكن التقاطه.catch وحده كافٍ.return للتدفق الطبيعي — المتصل يتعامل مع القيمة المرجعة. throw للتدفق غير الطبيعي — يتخطى الكود اللاحق ويرتفع في مكدس الاتصال بحثاً عن catch. استخدم throw للأخطاء، return للنتائج الطبيعية.📖 ملخص
try/catchيلتقط أخطاء وقت التشغيل؛finallyيُنفذ دائماً، مثالي للتنظيفthrowيرفع الأخطاء يدوياً — الأفضل استخدامthrow new Error("رسالة")- كائنات Error لها خصائص
nameوmessage؛ وحدة التحكم تظهر تتبع المكدس الكامل - أدوات المطور (F12): لوحة Sources لنقاط التوقف، Watch للمتغيرات، التنفيذ خطوة بخطوة
- دوال وحدة التحكم:
log/warn/error/table/group/time/timeEndتعزز كفاءة التصحيح
📝 تمارين
- اكتب دالة
safeDivide(a, b)تستخدم try...catch لمعالجة القسمة على صفر (تلميح: القسمة على صفر في JS لا تلقي خطأ — تحتاج للتحقق والإلقاء بنفسك). تُرجع النتيجة أو رسالة خطأ. - اكتب دالة
safeJSONParse(str)تحلل سلسلة JSON. عند الفشل، تُرجع{ success: false, error: <رسالة الخطأ> }. عند النجاح، تُرجع{ success: true, data: <نتيجة التحليل> }. - اكتب دالة
retry(fn, times): نفّذfn، وإذا ألقت خطأ، أعد المحاولة حتىtimesمرات. إذا فشلت جميع المحاولات، اطرح الخطأ الأخير. نفّذ باستخدام try...catch.