گزارش کردن خطاها زمانی مفید است که چیزی در یک برنامه یا بخشی از کد اشتباه یا غیرمنتظره باشد.
آنها شیءهای جاوااسکریپت هستند.
ویژگی اصلی این شیء 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 در تعریف کلاس فرزند، از طریق زنجیرهی پروتوتایپ رابطهای با کلاس والد برقرار میکند.
اشیائی که سازندهی فرزند ایجاد میکند، پروتوتایپ کلاس والد را در زنجیرهی پروتوتایپ خود خواهند داشت و این، دسترسی به هر متد یا دادهای که والد تعریف کرده است را فراهم میکند.
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
مانند هر کلاس دیگری در جاوااسکریپت، زیرکلاسها میتوانند با استفاده از کلیدواژهی extends از Error ارثبری کنند تا خطاهای سفارشی بسازند.
نحوهی نگارش 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');
}
}
النا مدیر کیفیت جدید یک کارخانهی روزنامهسازی است. چون تازه به شرکت آمده، تصمیم گرفته برخی از فرایندهای کارخانه را بررسی کند تا ببیند چه مواردی را میتوان بهتر کرد. او متوجه شده است که تکنسینها بسیاری از بررسیهای کیفی را دستی انجام میدهند. او فرصت خوبی برای خودکارسازی میبیند و از شما که یک برنامهنویس فریلنس هستید میخواهد نرمافزاری بنویسید که برخی از ماشینها را پایش کند.
مأموریت اول شما نوشتن نرمافزاری است که سطح رطوبت اتاق تولید را پایش کند. همین حالا حسگری به نرمافزار شرکت متصل است که بهطور دورهای درصد رطوبت اتاق را برمیگرداند.
باید در این نرمافزار تابعی پیادهسازی کنید که اگر درصد رطوبت بیش از حد بالا باشد، خطایی پرتاب کند.
اسم این تابع باید checkHumidityLevel باشد و درصد رطوبت را به عنوان پارامتر بگیرد.
اگر درصد رطوبت از ۷۰٪ بیشتر شود، باید خطایی پرتاب کنید (متن پیام مهم نیست).
checkHumidityLevel(60);
// => undefined
checkHumidityLevel(100);
// Throws an error
النا از اولین کار شما بسیار راضی است و از شما میخواهد که پایش دمای ماشینها را به عهده بگیرید. وقتی با یکی از تکنسینها به اسم گرگ گپ میزنید، متوجه میشوید که اگر دمای یک ماشین از ۵۰۰ درجه سانتیگراد بیشتر شود، تکنسینها نگران گرمای بیش از حد میشوند.
این ماشین به حسگری مجهز است که دمای داخلی آن را اندازه میگیرد. باید بدانید که این حسگر بسیار حساس است و اغلب خراب میشود. در این صورت، تکنسینها باید آن را عوض کنند.
کار شما پیادهسازی تابعی به اسم reportOverheating است که دما را به عنوان پارامتر میگیرد و اگر حسگر خراب باشد یا ماشین شروع به داغشدن بیش از حد کند، خطایی پرتاب میکند.
از آنجا که بعداً باید بسته به نوع خطا واکنش متفاوتی نشان دهید، به سازوکاری نیاز دارید که این دو نوع خطا را از هم تشخیص دهد.
میتوانستید به پیامهای خطا تکیه کنید، اما این کار کدتان را شکننده میکند، چون با بهروزرسانی پیام از کار میافتد.
پس برای اینکه این کار را درست انجام دهید، نمونههایی از کلاسهای خطای مختلف پرتاب میکنید.
null خواهد بود.
در این صورت، باید یک ArgumentError پرتاب کنید.OverheatingError پرتاب کنید.
این کلاس خطا با آرگومان دما نمونهسازی میشود.
حتماً مطمئن شوید که OverheatingError پرتابشده خاصیتی به اسم throw دارد.reportOverheating(null);
// Throws an ArgumentError
reportOverheating(800);
// Throws an OverheatingError
حالا که ماشین شما میتواند خطاها را تشخیص دهد، تابعی پیادهسازی میکنید که به این خطاها به شکلهای مختلف واکنش نشان میدهد:
تابعی به اسم monitorTheMachine پیادهسازی کنید که آرگومانی به اسم actions میگیرد.
actions شیئی است که ۴ خاصیت دارد:
| خاصیت | توضیح |
|---|---|
check |
یک تابع. دمای ماشین را بررسی میکند. ممکن است خطاهای مختلفی پرتاب کند. |
alertDeadSensor |
یک تابع. به تکنسین هشدار میدهد که حسگر دما از کار افتاده است. |
alertOverheating |
یک تابع. چراغ هشدار روی ماشین را روشن میکند. |
shutdown |
یک تابع. ماشین را خاموش میکند. |
تابع monitorTheMachine(actions) باید در داخل خود check() را فراخوانی کند.
اگر این فراخوانی بدون خطا انجام شود، تابع نباید چیزی برگرداند.
اگر خطایی پرتاب شود، رفتار متفاوتی انتظار میرود:
| استثنا | رفتار مورد انتظار |
|---|---|
ArgumentError |
تابع alertDeadSensor را فراخوانی کنید. |
OverheatingError |
پروتکل گرمای بیش از حد را اجرا کنید. |
| (هر مورد دیگر) | خطا را دوباره پرتاب کنید |
پروتکل گرمای بیش از حد
اگر دما کمتر از ۶۰۰ درجه سانتیگراد است، با فراخوانی تابع alertOverheating چراغ هشدار را روشن کنید.
اگر دما از ۶۰۰ درجه سانتیگراد بیشتر شود، وضعیت بحرانی است، پس تابع shutdown را فراخوانی کنید.
monitorTheMachine({
check,
alertDeadSensor,
alertOverheating,
shutdown,
});
در Exercism ثبتنام کنید تا JavaScript را همراه با 37 مفهوم159 تمرین و مربیگری انسانی واقعی یاد بگیرید و در آن استاد شوید، همهی اینها رایگان.