Menu
CoddyTech

טיפול בשגיאות

חלק מהיחידה יסודות Node.js במסלול ה-Node.js של Coddy. שיעור 16 מתוך 33.

קובץ notes.json שנערך ידנית עלול להיפגם. במקרה כזה JSON.parse זורקת שגיאה, ו-Node מדפיס מעקב מחסנית: רשימה ארוכה של שורות קוד שהובילו לשגיאה.

try מריצה קוד שעלול לזרוק שגיאה. כשהדבר קורה, catch מקבלת את השגיאה והתוכנית שלך מחליטה מה לומר. err.message מכילה את הסיבה בשורה אחת.

let config;
try {
    config = JSON.parse('{ port: 3000 }');
} catch (err) {
    console.error(`config is broken: ${err.message}`);
    process.exit(1);
}

אל תתפסי את השגיאה ותמשיכי עם רשימה ריקה: פעולת add הבאה תשמור מעל הקובץ הפגום, וכל ההערות שבו יאבדו.

challenge icon

אתגר

קל

מישהו ערך ידנית את notes.json והשאיר פסיק מיותר. עכשיו JSON.parse זורקת שגיאה, ו-Node מדפיס מעקב מחסנית ארוך. גרמו לכלי להדפיס שורה ברורה אחת במקום זאת ולעצור, כדי שלא ישמור אף פעם מעל הקובץ הפגום.

  1. ב-store.js, מצאו היכן ההערות נטענות: JSON.parse(readFileSync(...)), בתוך האובייקט store. לכדו את השגיאה ש-JSON.parse זורקת כשהקובץ אינו JSON תקין. אי אפשר להציב try בתוך אובייקט, לכן העבירו את הטעינה לפונקציה או למשתנה שמוגדרים לפני האובייקט, והשתמשו בתוצאה שלו עבור notes.
  2. כשהניתוח נכשל, הדפיסו שורה אחת ל-stderr, ואז צאו עם קוד 1. השורה מתחילה ב-notes.json is damaged: וממשיכה בהודעת השגיאה, שהיא הסיבה ש-JSON.parse מציינת, כמו Unexpected token ']'. אל תדפיסו את מעקב המחסנית. אל תמשיכו עם רשימה ריקה: הפקודה הבאה add תשמור מעל ההערות הפגומות.
  3. אם notes.json חסר, עדיין משתמשים בחנות ריקה, כמו קודם. הבדיקה מתבצעת עבור כל פקודה, כי כל פקודה טוענת את החנות.

נסו זאת: הקלידו list בתיבה שאחרי $ node notes.js לפני שתשנו משהו. תראו מעקב מחסנית אדום. אחרי השינוי, list תדפיס רק את השורה האדומה notes.json is damaged: ... ואת קוד היציאה 1. כדי לראות שוב את ההערות, מחקו את הפסיק שאחרי "Call Ada" ב-notes.json והריצו list. אחר כך החזירו את הפסיק לפני שתלחצו על "בדיקה": הבדיקות זקוקות לקובץ הפגום, ו-Reset files לא מבטל את העריכות שלכם.

נסו בעצמכם

import { existsSync, readFileSync, writeFileSync } from 'node:fs';

const file = 'notes.json';

const store = {
    notes: existsSync(file) ? JSON.parse(readFileSync(file, 'utf8')) : [],
    save() {
        writeFileSync(file, JSON.stringify(this.notes, null, 2));
    },
    add(text) {
        this.notes.push(text);
        this.save();
        return this.notes.length;
    },
    remove(n) {
        const [text] = this.notes.splice(n - 1, 1);
        this.save();
        return text;
    },
};

export default store;

כל השיעורים ביחידה יסודות Node.js

תרגלו בעצמכם: Express אונליין