جلسه ۸ - دیباگ - پیدا کردن و رفع خطاها

بررسی پاسخ‌های بخش ۷:

**پاسخ ۱:

  • در جاوااسکریپت، تقسیم بر صفر خطا نمی‌دهد!
  • نتیجه تقسیم بر صفر Infinity است
  • بنابراین کد داخل catch اجرا نمی‌شود

خروجی صحیح:

Infinity
پایان محاسبات

**پاسخ ۲:

  • data.age برابر undefined است
  • undefined.toString() خطای TypeError می‌دهد
  • خطا در catch گرفته می‌شود و “خطا رخ داد” چاپ می‌شود

**پاسخ ۳:

  • ساختار کلی درست است
  • اما prompt همیشه یک رشته برمی‌گرداند، باید به عدد تبدیل شود
try {
    const input = prompt('لطفاً یک عدد وارد کنید:');
    const number = Number(input);
    
    if (number < 0) {
        throw new Error('عدد نمی‌تواند منفی باشد');
    }
    
    console.log('عدد معتبر است: ' + number);
} catch (error) {
    console.log('خطا: ' + error.message);
}

خلاصه نکات مهم مدیریت خطا:

  1. خطاهای رایج:

    • ReferenceError: متغیر تعریف نشده
    • TypeError: عملیات روی نوع نادرست
    • SyntaxError: خطای دستوری
    • RangeError: عدد خارج از محدوده مجاز
  2. تقسیم بر صفر:

    • در جاوااسکریپت خطا نمی‌دهد
    • 10 / 0Infinity
    • -10 / 0-Infinity
    • 0 / 0NaN
  3. ‏best practiceها:

    • از try-catch فقط برای خطاهای غیرقابل پیش‌بینی استفاده کن
    • خطاهای قابل پیش‌بینی را با شرط‌های عادی بررسی کن
    • در finally عملیات پاکسازی (مثل بستن فایل) را انجام بده

بخش ۸: دیباگینگ - پیدا کردن و رفع خطاها

۱. استفاده از‭console.log()

ساده‌ترین روش برای دنبال کردن مقدار متغیرها:

function calculate(a, b) {
    console.log("ورودی‌ها:", a, b); // ✅ خوب
    let result = a + b;
    console.log("نتیجه:", result); // ✅ خوب
    return result;
}
 
calculate(5, 3);

۲. استفاده از debugger

ایجاد breakpoint برنامه‌ریزی شده در کد:

function findMax(x, y) {
    debugger; // ❗اجرا در این خط متوقف می‌شود
    if (x > y) {
        return x;
    } else {
        return y;
    }
}
 
let max = findMax(10, 5);
console.log("بیشترین:", max);

۳. Breakpoints در DevTools

قدرتمندترین روش برای دیباگینگ:

مراحل استفاده در Chrome:

  1. راست‌کلیک → “Inspect”
  2. تب “Sources”
  3. انتخاب فایل JS
  4. کلیک روی شماره خط برای قرار دادن breakpoint
  5. رفرش صفحه

۴. تحلیل Call Stack

پیگیری ترتیب فراخوانی توابع:

function first() {
    second();
}
 
function second() {
    third();
}
 
function third() {
    console.trace(); // 🔍 نمایش call stack
    throw new Error("خطای آزمایشی");
}
 
first();

سؤالات تمرینی بخش ۸:

۱. مشکل کد زیر چیست و چگونه با console.log آن را دیباگ می‌کنی؟

function multiply(a, b) {
    let result = a * b;
    return result;
}
 
let total = multiply(5, "2");
console.log(total);

۲. چگونه از debugger برای بررسی کد زیر استفاده می‌کنی؟

function checkAge(age) {
    if (age >= 18) {
        return "بزرگسال";
    } else {
        return "خردسال";
    }
}
 
let status = checkAge(20);

۳. چه خطایی در کد زیر رخ می‌دهد و call stack چگونه خواهد بود؟

function start() {
    process();
}
 
function process() {
    calculate();
}
 
function calculate() {
    let data = undefined;
    console.log(data.name);
}
 
start();