Menu
CoddyTech

오류 처리

Coddy Node.js 여정의 Node.js 기초 섹션에 포함된 레슨. 33개 중 16번째.

손으로 편집한 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에서 메모를 불러오는 부분, 즉 store 객체 안의 JSON.parse(readFileSync(...))를 찾으세요. 파일이 올바른 JSON이 아닐 때 JSON.parse에서 발생하는 오류를 처리하세요. try는 객체 안에 들어갈 수 없으므로, 불러오기 코드를 객체 위쪽의 함수나 변수로 옮기고 그 결과를 notes에 사용하세요.
  2. 파싱에 실패하면 stderr에 한 줄을 출력한 다음 코드 1로 종료하세요. 이 줄은 notes.json is damaged: 로 시작하고 오류 메시지를 이어서 표시합니다. 오류 메시지는 JSON.parse가 알려주는 원인으로, 예를 들면 Unexpected token ']'과 같습니다. 스택 추적은 출력하지 마세요. 빈 목록으로 계속 진행하지 마세요. 그러면 다음 add 명령이 손상된 메모 위에 덮어쓸 수 있습니다.
  3. notes.json이 없으면 이전과 마찬가지로 빈 저장소로 처리합니다. 모든 명령이 저장소를 불러오므로 이 검사는 모든 명령에서 실행됩니다.

직접 해보기: 아무것도 변경하기 전에 $ node notes.js 다음의 입력란에 list를 입력하세요. 빨간색 스택 추적이 표시됩니다. 변경한 뒤에는 list가 빨간색 줄 notes.json is damaged: ...만 출력하고 코드 1로 종료됩니다. 메모를 다시 보려면 notes.json에서 "Call Ada" 뒤의 쉼표를 삭제하고 list를 실행하세요. 그런 다음 ‘확인’을 누르기 전에 쉼표를 다시 넣으세요. 검사에는 손상된 파일이 필요하며, 파일 재설정은 직접 수정한 내용을 되돌리지 않습니다.

직접 해보기

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 플레이그라운드