تكون الأخطاء مفيدة للإبلاغ عندما يكون هناك خطأ ما أو شيء غير متوقع في برنامج أو في جزء من الكود.
وهي كائنات JavaScript.
الخاصية الرئيسية في هذا الكائن هي message:
const error = new Error('Oops, something went wrong');
console.log(error.message);
// => "Oops, something went wrong"
باستخدام صيغة throw، يمكنك إطلاق خطأ.
throw new Error('Oops');
عند إطلاق خطأ، يتوقف التنفيذ الحالي ويُستأنف في أول كتلة catch من مكدس الاستدعاءات.
try {
throw new Error('Oops');
} catch (error) {
console.log(error.message);
// => "Oops"
}
الوراثة أسلوب لإنشاء علاقات من نوع الأصل والفرع بين الأصناف. الصنف الابن (ويُشار إليه أحيانًا باسم الصنف الفرعي) يمكنه الوصول إلى السلوك والبيانات التي يعرّفها الصنف الأب (ويُشار إليه أحيانًا باسم الصنف الأعلى).
class Pet {
constructor(name) {
this.name = name;
}
introduce() {
console.log(`This is my pet, ${this.name}.`);
}
}
class Dog extends Pet {}
const dog = new Dog('Otis');
dog.introduce();
// => This is my pet, Otis.
الكلمة المفتاحية extends في تعريف الصنف الابن تُنشئ علاقة مع الصنف الأب عبر سلسلة prototype.
الكائنات التي يُنشئها منشئ الصنف الابن تحتوي على prototype الخاص بالصنف الأب ضمن سلسلة prototype الخاصة بها، ما يتيح الوصول إلى أي طُرق أو بيانات يعرّفها الصنف الأب.
const dog = new Dog('Otis');
Dog.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(Dog.prototype); // => true
Pet.prototype.hasOwnProperty('introduce'); // => true
Dog.prototype.hasOwnProperty('introduce'); // => false
dog.hasOwnProperty('introduce'); // => false
وكما هو الحال مع أي صنف في JavaScript، يمكن للأصناف الفرعية أن ترث من Error لإنشاء أخطاء مخصصة باستخدام الكلمة المفتاحية extends.
تتحقق صيغة instanceof مما إذا كان الخطأ الذي تم التقاطه نسخة من صنف فرعي معيّن من Error.
class CustomError extends Error {}
try {
// ... Code that may throw an error
} catch (error) {
if (error instanceof CustomError) {
console.log('The error thrown is an instance of the CustomError');
}
}
Elena هي مديرة الجودة الجديدة في مصنع صحف. ولأنها وصلت للتو إلى الشركة، قررت مراجعة بعض العمليات في المصنع لترى ما يمكن تحسينه. اكتشفت أن الفنيين يجرون الكثير من فحوص الجودة يدويًا. ترى أن هناك فرصة جيدة للأتمتة، فتطلب منك، كمطور مستقل، أن تطوّر برنامجًا لمراقبة بعض الآلات.
مهمتك الأولى هي كتابة برنامج لمراقبة مستوى الرطوبة في غرفة الإنتاج. يوجد بالفعل مستشعر متصل ببرنامج الشركة يُرجع بشكل دوري نسبة الرطوبة في الغرفة.
عليك تنفيذ دالة في البرنامج ترمي خطأً إذا كانت نسبة الرطوبة مرتفعة جدًا.
يجب أن تُسمّى الدالة checkHumidityLevel وأن تأخذ نسبة الرطوبة كمعامل.
يجب أن ترمي خطأً (الرسالة غير مهمة) إذا تجاوزت النسبة 70%.
checkHumidityLevel(60);
// => undefined
checkHumidityLevel(100);
// Throws an error
Elena سعيدة جدًا بمهمتك الأولى وتطلب منك أن تتولى مراقبة درجة حرارة الآلات. وأثناء حديثك مع الفني Greg، يُخبرك أنه إذا تجاوزت درجة حرارة آلة 500°C، يبدأ الفنيون في القلق من ارتفاع درجة الحرارة.
الآلة مزوّدة بمستشعر يقيس درجة حرارتها الداخلية. يجب أن تعرف أن المستشعر حساس جدًا وغالبًا ما يتعطل. وفي هذه الحالة، سيحتاج الفنيون إلى تغييره.
مهمتك هي تنفيذ دالة reportOverheating تأخذ درجة الحرارة كمعامل وترمي خطأً إذا كان المستشعر معطلًا أو إذا بدأت الآلة في ارتفاع درجة الحرارة.
ولأنك ستحتاج لاحقًا إلى التصرف بشكل مختلف حسب نوع الخطأ، فأنت بحاجة إلى آلية للتمييز بين نوعي الأخطاء.
يمكنك الاعتماد على رسائل الخطأ، لكن هذا سيجعل الكود هشًا لأنه سيتعطل إذا حُدّثت الرسالة.
لذا، ولتتمكن من ذلك بشكل صحيح، سترمي نسخًا من أصناف أخطاء مختلفة.
null.
في هذه الحالة، يجب أن ترمي ArgumentError.OverheatingError.
سيتم إنشاء نسخة من صنف الخطأ هذا بوسيط هو درجة الحرارة.
تأكد من أن OverheatingError الذي ترميه يحتوي على خاصية throw مرتبطة به.reportOverheating(null);
// Throws an ArgumentError
reportOverheating(800);
// Throws an OverheatingError
الآن بعد أن أصبحت آلتك قادرة على اكتشاف الأخطاء، ستنفذ دالة تتفاعل مع هذه الأخطاء بطرق مختلفة:
نفّذ دالة monitorTheMachine تأخذ وسيطًا اسمه actions.
actions كائن له 4 خصائص:
| الخاصية | الوصف |
|---|---|
check |
دالة. تفحص درجة حرارة الآلة. وقد ترمي أخطاءً متنوعة. |
alertDeadSensor |
دالة. تنبّه الفني إلى أن مستشعر درجة الحرارة معطل. |
alertOverheating |
دالة. ستشغّل ضوءًا تحذيريًا على الآلة. |
shutdown |
دالة. ستوقف الآلة. |
دالة monitorTheMachine(actions) يجب أن تستدعي check() داخليًا.
إذا نجح ذلك، فلا يجب أن تُرجع الدالة أي شيء.
وإذا رمى ذلك خطأً، فمن المتوقع سلوك مختلف:
| الاستثناء | السلوك المتوقع |
|---|---|
ArgumentError |
استدعاء الدالة alertDeadSensor. |
OverheatingError |
تنفيذ بروتوكول ارتفاع درجة الحرارة. |
| (أي شيء آخر) | إعادة رمي الخطأ |
بروتوكول ارتفاع درجة الحرارة
إذا كانت درجة الحرارة أقل من 600 °C، فشغّل الضوء التحذيري باستدعاء الدالة alertOverheating.
وإذا تجاوزت درجة الحرارة 600 °C، فالوضع حرج، لذا استدعِ الدالة shutdown.
monitorTheMachine({
check,
alertDeadSensor,
alertOverheating,
shutdown,
});
سجّل في Exercism لتتعلّم وتتقن JavaScript عبر 37 مفهومًا159 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.