טיפול בשגיאות
חלק מהיחידה יסודות 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 הבאה תשמור מעל הקובץ הפגום, וכל ההערות שבו יאבדו.
אתגר
קלמישהו ערך ידנית את notes.json והשאיר פסיק מיותר. עכשיו JSON.parse זורקת שגיאה, ו-Node מדפיס מעקב מחסנית ארוך. גרמו לכלי להדפיס שורה ברורה אחת במקום זאת ולעצור, כדי שלא ישמור אף פעם מעל הקובץ הפגום.
- ב-
store.js, מצאו היכן ההערות נטענות:JSON.parse(readFileSync(...)), בתוך האובייקטstore. לכדו את השגיאה ש-JSON.parseזורקת כשהקובץ אינו JSON תקין. אי אפשר להציבtryבתוך אובייקט, לכן העבירו את הטעינה לפונקציה או למשתנה שמוגדרים לפני האובייקט, והשתמשו בתוצאה שלו עבורnotes. - כשהניתוח נכשל, הדפיסו שורה אחת ל-stderr, ואז צאו עם קוד 1. השורה מתחילה ב-
notes.json is damaged:וממשיכה בהודעת השגיאה, שהיא הסיבה ש-JSON.parseמציינת, כמוUnexpected token ']'. אל תדפיסו את מעקב המחסנית. אל תמשיכו עם רשימה ריקה: הפקודה הבאהaddתשמור מעל ההערות הפגומות. - אם
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
1הרצת JavaScript ב-Node
שלום, Nodeקריאת הפקודהארגומנטים של שורת הפקודהפקודותתרגלו בעצמכם: Express אונליין