10. 오류와 친구하기 (에러 처리와 디버깅)/10.1 에러 처리하기

10.1.1 try...catch로 문제 잡기 - 안전망이 있는 코딩 모험

thejavascript4kids 2025. 7. 13. 05:16

📘 10.1.1 try...catch로 문제 잡기 - 안전망이 있는 코딩 모험

안녕하세요, 여러분. 지금까지 우리는 자바스크립트의 여러 기능들을 함께 배워왔습니다. 변수, 함수, 객체, 그리고 this까지... 정말 많은 것들을 익혔지요. 하지만 프로그래밍을 하다 보면 예상치 못한 문제들이 생기기도 합니다.

마치 길을 걷다가 예상치 못한 돌부리에 걸려 넘어질 수 있는 것처럼, 코드도 그런 순간들을 맞이하게 됩니다. 이제 그런 문제들을 부드럽게 해결하는 방법을 배워볼 시간입니다. 바로 try...catch라는 따뜻한 안전망 말이에요. 마치 아이가 넘어져도 다치지 않도록 부드러운 매트를 깔아주는 것처럼요.

🧠 새로운 단어들과 친해지기

프로그래밍 세계의 안전장치와 친해지기 전에, 새로운 용어들을 먼저 차근차근 알아보겠습니다.

단어 쉬운 설명
에러 (Error) 프로그램이 실행되다가 예상치 못한 일이 생겨서 멈추거나 이상하게 동작하는 것입니다.
try...catch 문제가 생길 수 있는 코드를 조심스럽게 실행하고, 문제가 생기면 따뜻하게 처리하는 방법입니다.
에러 처리 문제가 발생했을 때 프로그램이 갑자기 멈추지 않고 우아하게 문제를 해결하는 것입니다.

에러(Error)는 영어로 "실수"나 "오류"라는 뜻입니다. 컴퓨터 세계에서는 프로그램이 예상대로 동작하지 않을 때 발생하는 문제를 말하지요. 하지만 걱정하지 마세요. try...catch라는 훌륭한 도구가 있어서 이런 문제들을 따뜻하게 처리할 수 있거든요.

✨ try...catch가 뭔지 알아보기

try...catch는 프로그래밍에서 정말 소중한 안전장치입니다. 마치 아이가 자전거를 처음 탈 때 뒤에서 조용히 받쳐주는 손길과 같아요. 넘어져도 다치지 않도록, 실수해도 포기하지 않도록 도와주는 것이지요.

try...catch의 기본 생각은 매우 담백합니다. "이것을 조심스럽게 시도해보자(try). 만약 문제가 생기면 이렇게 처리하자(catch)"라는 뜻입니다. 이렇게 하면 프로그램이 갑자기 멈추는 것을 방지하고, 사용자에게 친근한 메시지를 보여줄 수 있어요.

가장 아름다운 점은 문제가 발생해도 프로그램이 계속 실행된다는 것입니다. 마치 넘어져도 일어나서 계속 걸어가는 것처럼, 프로그램도 문제가 생겨도 포기하지 않고 계속 진행할 수 있어요.

따뜻한 비유: 요리할 때 실수를 해결하는 방법

try...catch를 더 쉽게 이해하기 위해 '요리할 때 실수 해결하기' 이야기를 들려드릴게요.

여러분이 처음으로 요리를 배우고 있다고 상상해보세요. 계란후라이를 만들려고 하는데, 여러 실수가 생길 수 있어요.

성급한 요리 방법:
"그냥 계란을 후라이팬에 넣자!" → 계란이 깨져서 흘러넘침 → 요리 포기

조심스러운 요리 방법 (try...catch):
"조심스럽게 계란을 후라이팬에 넣어보자(try)... 어? 계란이 깨졌네? 괜찮아, 키친타월로 닦고 다시 시도하자(catch)... 좋아, 요리를 계속하자!"

이처럼 조심스러운 요리사는 실수가 생겨도 해결 방법을 미리 준비해두었어요. 문제가 생겨도 당황하지 않고 미리 준비해둔 해결책으로 문제를 처리한 다음, 요리를 계속 진행했어요.

🎯 왜 try...catch를 사용할까요?

try...catch를 사용하는 이유는 여러 가지가 있습니다.

첫째로, 프로그램을 더 안전하게 만들 수 있어요. 예상치 못한 문제로 인해 프로그램이 갑자기 멈추는 것을 방지할 수 있습니다. 마치 자동차에 안전벨트가 있는 것처럼요.

둘째로, 사용자에게 더 따뜻한 경험을 선사할 수 있어요. 복잡한 에러 메시지 대신 사용자가 이해하기 쉬운 친근한 메시지를 보여줄 수 있습니다.

셋째로, 문제 찾기가 쉬워집니다. 어떤 부분에서 어떤 문제가 발생했는지 명확히 알 수 있어서 문제를 더 빨리 해결할 수 있어요.

마지막으로, 예측 가능한 동작을 만들 수 있습니다. 문제가 발생했을 때 어떻게 처리할지 미리 정해두면, 프로그램의 동작을 더 쉽게 예측할 수 있어요.

⚙️ 기본 사용법 배우기

try...catch의 기본 사용법은 생각보다 단순합니다.

try {
    // 위험할 수 있는 코드를 여기에 쓰기
    위험한_작업();
} catch (error) {
    // 문제가 발생했을 때 할 일을 여기에 쓰기
    console.log("문제가 생겼지만 해결했어요: " + error.message);
}

핵심 포인트:

  • try 부분: 문제가 날 수 있는 코드를 넣는 곳
  • catch 부분: 문제가 났을 때 실행할 코드를 넣는 곳
  • error 정보: 발생한 문제에 대한 정보를 담고 있어요

🧪 직접 해보면서 배우기

이제 실제 예시를 통해서 try...catch가 어떻게 동작하는지 자세히 알아보겠습니다.

🔹 Ex1) 첫 번째 안전망 체험하기

첫 번째 예시에서는 가장 기본적인 try...catch 사용법을 알아보겠습니다.

console.log("=== 안전한 코딩 모험 시작! ===");

try {
    console.log("1단계: 안전한 계산부터 해볼게요");
    let safeResult = 10 + 5;  // 안전한 계산 - 문제없이 실행됨
    console.log("안전한 계산 결과: " + safeResult);

    console.log("2단계: 이제 조금 위험한 일을 해볼게요");
    // 존재하지 않는 함수를 사용하려고 시도 (문제 발생!)
    let dangerousResult = unknownFunction();  // 여기서 문제 발생

    console.log("3단계: 이 줄은 실행되지 않아요 (문제 때문에)");

} catch (error) {
    console.log("앗! 문제가 생겼어요: " + error.message);      // 문제 내용 출력
    console.log("하지만 걱정하지 마세요. 안전하게 처리했어요!");  // 안심 메시지
}

console.log("4단계: 프로그램이 계속 실행되고 있어요!");  // 프로그램 계속 진행
console.log("=== 모험 완료! ===");

이 예시를 보면, try 부분에서 문제가 발생하는 순간 즉시 catch 부분으로 넘어간다는 것을 알 수 있어요. 그리고 catch에서 문제를 처리한 후에는 프로그램이 정상적으로 계속 실행됩니다.

🔹 Ex2) 안전한 계산기 만들기

두 번째 예시에서는 문제가 발생할 수 있는 계산 작업을 안전하게 처리하는 함수를 만들어보겠습니다.

// 안전한 나누기 함수 만들기
function safeDivision(a, b) {
    try {
        console.log("계산 시작: " + a + " ÷ " + b);

        // 0으로 나누는 경우 확인
        if (b === 0) {
            throw new Error("0으로 나눌 수 없어요!");  // 의도적으로 에러 발생시키기
        }

        // 숫자가 아닌 경우 확인
        if (typeof a !== 'number' || typeof b !== 'number') {
            throw new Error("숫자만 계산할 수 있어요!");  // 의도적으로 에러 발생시키기
        }

        let result = a / b;  // 실제 계산 수행
        console.log("계산 성공! 결과: " + result);
        return result;

    } catch (error) {
        console.log("계산 실패: " + error.message);  // 문제 내용 출력
        console.log("기본값 0을 반환할게요.");        // 대안 제시
        return 0;                                   // 안전한 기본값 반환
    }
}

// 여러 가지 경우로 테스트해보기
console.log("=== 안전한 계산기 테스트 ===");
safeDivision(10, 2);      // 정상 계산 - 결과: 5
safeDivision(10, 0);      // 0으로 나누기 시도 - 문제 발생
safeDivision("열", 2);    // 문자열로 계산 시도 - 문제 발생

이 예시에서는 throw new Error()를 사용해서 의도적으로 에러를 발생시키는 방법도 볼 수 있어요. 이렇게 하면 특정 조건에서 에러를 만들어서 catch에서 처리할 수 있습니다.

🔹 Ex3) 친구들의 정보를 안전하게 처리하기

세 번째 예시에서는 여러 친구들의 정보를 처리하면서 문제가 발생할 수 있는 상황을 안전하게 다뤄보겠습니다.

// 친구들의 정보 배열
let friendsData = [
    { name: "철수", age: 10 },     // 정상 정보
    { name: "영희", age: 11 },     // 정상 정보
    { name: "민수" },              // age가 없음 (문제 상황)
    null,                          // null 값 (문제 상황)
    { name: "지수", age: 9 }       // 정상 정보
];

// 안전한 친구 소개 함수
function introduceFriend(friendData) {
    try {
        // 친구 정보가 없는 경우
        if (!friendData) {
            throw new Error("친구 정보가 없어요");  // 정보 없음 에러 발생
        }

        // 이름이 없는 경우
        if (!friendData.name) {
            throw new Error("이름 정보가 없어요");  // 이름 없음 에러 발생
        }

        // 나이가 없는 경우
        if (!friendData.age) {
            throw new Error("나이 정보가 없어요");  // 나이 없음 에러 발생
        }

        // 모든 정보가 있는 경우 정상 소개
        let message = "안녕하세요! 저는 " + friendData.name + "이고, " + friendData.age + "살입니다.";
        console.log("✅ " + message);  // 성공 표시와 함께 출력
        return message;

    } catch (error) {
        console.log("❌ 소개 실패: " + error.message);     // 실패 표시와 함께 문제 내용 출력
        return "정보가 부족한 친구입니다.";                 // 기본 메시지 반환
    }
}

// 모든 친구들을 안전하게 소개해보기
console.log("=== 친구들 소개 시간 ===");

friendsData.forEach((friend, index) => {  // 각 친구에 대해 반복
    console.log("\n" + (index + 1) + "번째 친구:");  // 친구 번호 출력
    introduceFriend(friend);                         // 친구 소개 시도
});

console.log("\n=== 모든 친구 소개 완료! ===");

이 예시를 통해 배열의 각 요소를 처리할 때도 try...catch가 어떻게 유용한지 확인할 수 있어요. 일부 정보에 문제가 있어도 전체 처리가 멈추지 않고 계속 진행됩니다.

🔄 try...catch 동작하는 순서 정리하기

지금까지 배운 try...catch의 동작 과정을 차근차근 정리해볼게요.

첫 번째 단계try 부분 실행입니다. 자바스크립트가 try 부분 안의 코드를 한 줄씩 차례대로 실행해요.

두 번째 단계에러 감지 단계입니다. 실행 중에 문제가 발생하는지 자바스크립트 엔진이 조용히 지켜보고 있어요.

세 번째 단계에러 처리 결정 단계입니다. 에러가 발생하면 즉시 try 부분의 나머지 코드를 건너뛰고 catch 부분으로 이동해요.

네 번째 단계catch 부분 실행 단계입니다. 에러 정보를 error 매개변수로 받아서 적절한 처리를 수행해요.

마지막으로 가장 중요한 것계속 실행 단계입니다. catch 부분이 끝나면 try...catch 다음의 코드가 정상적으로 계속 실행됩니다.

🧚‍♀️ 이야기로 다시 배우기: 요리 교실의 안전 수업

지금까지 배운 내용을 따뜻한 이야기로 다시 정리해볼까요?

학교 요리 교실에서 안전 요리 수업이 있었습니다. 선생님은 학생들에게 실수를 해도 안전하게 요리하는 방법을 가르쳐주었어요.

선생님이 부드럽게 말했어요:
"여러분, 새로운 요리를 배울 때는 항상 '안전 요리법'을 사용해야 해요. 먼저 '조심히 해보자(try)'라고 말하면서 새로운 요리를 조심스럽게 시도해보세요."

그리고 이어서 말했어요:
"그리고 만약 요리가 실패하거나 문제가 생기면, '괜찮아, 정리하고 다시 하자(catch)'라고 말하면서 문제를 해결하세요. 그러면 요리를 계속할 수 있답니다."

어느 날 학생 코드'계란후라이'를 만들어봤어요:

// 코드의 요리 실습
try {
    console.log("계란후라이를 만들어볼게요!");  // 요리 시작 선언

    // 위험한 요리 과정
    let egg = breakEgg(); // 존재하지 않는 함수 사용 - 에러 발생!

    console.log("성공했어요!");  // 이 줄은 실행되지 않음

} catch (cookingError) {
    console.log("앗! 요리가 실패했어요: " + cookingError.message);  // 실패 메시지
    console.log("괜찮아요, 다음에 다시 만들어보면 돼요!");           // 격려 메시지
}

console.log("요리 수업을 계속 진행할게요!");  // 수업 계속 진행

이렇게 코드는 요리가 실패해도 포기하지 않고 계속 수업을 받을 수 있었답니다. 안전 요리법 덕분이었어요!

🧠 자주 하는 실수와 주의할 점

try...catch를 사용할 때 자주 하는 실수들을 미리 알아두면 더 안전하게 코딩할 수 있어요.

❌ 실수 1: catch에서 에러를 무시하기

try {
    let result = riskyOperation();  // 위험한 작업 수행
    console.log("결과: " + result);
} catch (error) {
    // 아무것도 하지 않기 (나쁜 습관!)
    // 에러가 나도 조용히 넘어감
}

이런 실수가 발생하는 이유는 "에러가 나도 조용히 넘어가면 되겠지"라고 생각하기 때문입니다. 하지만 이렇게 하면 나중에 문제를 찾기가 매우 어려워져요. 최소한 console.log로라도 에러를 기록해야 해요. 마치 아프다고 말하지 않으면 병을 치료할 수 없는 것과 같아요.

❌ 실수 2: 안전한 코드까지 모두 try로 감싸기

try {
    let name = "철수";                              // 안전한 코드
    let age = 10;                                   // 안전한 코드
    let message = name + "는 " + age + "살입니다.";  // 안전한 코드
    console.log(message);                           // 안전한 코드
} catch (error) {
    console.log("문제 발생");  // 필요 없는 catch
}

이 문제가 생기는 이유는 "모든 코드를 try로 감싸면 더 안전할 것"이라고 잘못 생각하기 때문입니다. 하지만 에러가 날 가능성이 거의 없는 코드까지 감쌀 필요는 없어요. 오히려 정말 위험한 부분을 찾기 어려워질 수 있어요.

❌ 실수 3: catch 부분에서 또 다른 에러 발생시키기

try {
    someRiskyFunction();  // 위험한 함수 실행
} catch (error) {
    // catch 안에서 또 에러 발생!
    console.log(notExistingVariable.toString()); // 존재하지 않는 변수 사용 - 에러!
    console.log("에러를 처리했어요");
}

이런 실수가 발생하는 이유는 catch 부분도 일반 코드라는 것을 잊어버리기 때문입니다. catch 안에서 에러가 발생하면 그 에러는 처리되지 않아서 프로그램이 멈출 수 있어요. catch 부분의 코드도 안전하게 작성해야 해요.

✏️ 직접 해보기 - 연습이 필요한 순간

이제 배운 내용을 연습 문제를 통해서 확실히 익혀보겠습니다.

시간이 흘러 여러분의 손끝에서 코드가 춤을 추기 시작합니다. 한 글자 한 글자 입력할 때마다 작은 기적이 일어나는 것을 느끼실 거예요. 그 기적을 직접 만들어보세요.

Ex1) 안전한 인사 함수를 만들어보기

// 안전한 인사 함수 만들기
function safeGreeting(name) {
    try {
        // 이름이 없는 경우 에러 발생
        if (!name) {
            throw new Error("이름을 입력해주세요!");  // 빈 이름 에러 발생
        }

        // 문자열이 아닌 경우 에러 발생
        if (typeof name !== 'string') {
            throw new Error("이름은 글자로 입력해주세요!");  // 타입 에러 발생
        }

        let greeting = "안녕하세요, " + name + "님!";  // 정상 인사 메시지 생성
        console.log(greeting);                        // 인사 메시지 출력
        return greeting;                              // 인사 메시지 반환

    } catch (error) {
        console.log("인사 실패: " + error.message);  // 실패 원인 출력
        return "안녕하세요!";                       // 기본 인사 반환
    }
}

// 테스트해보기
safeGreeting("지우");    // 정상 인사 - "안녕하세요, 지우님!"
safeGreeting("");       // 빈 이름 - 에러 발생
safeGreeting(123);      // 숫자로 이름 전달 - 에러 발생

이 연습을 통해 try...catchthrow new Error()를 함께 사용하는 방법을 익힐 수 있어요.

Ex2) 안전한 배열 처리 함수를 만들어보기

// 배열의 첫 번째 요소를 안전하게 가져오는 함수
function safeGetFirst(arr) {
    try {
        // 배열이 아닌 경우
        if (!Array.isArray(arr)) {
            throw new Error("배열을 전달해주세요!");  // 배열이 아님 에러 발생
        }

        // 빈 배열인 경우
        if (arr.length === 0) {
            throw new Error("배열이 비어있어요!");  // 빈 배열 에러 발생
        }

        let firstElement = arr[0];                        // 첫 번째 요소 가져오기
        console.log("첫 번째 요소: " + firstElement);     // 결과 출력
        return firstElement;                              // 첫 번째 요소 반환

    } catch (error) {
        console.log("처리 실패: " + error.message);  // 실패 원인 출력
        return null;                                 // 기본값 null 반환
    }
}

// 테스트해보기
safeGetFirst([1, 2, 3]);     // 정상 처리 - 첫 번째 요소: 1
safeGetFirst([]);           // 빈 배열 - 에러 발생
safeGetFirst("문자열");      // 배열이 아님 - 에러 발생

이 문제는 다양한 에러 상황을 처리하는 연습에 도움이 됩니다.

Ex3) 간단한 에러 기록 시스템을 만들어보기

// 에러 기록 배열
let errorLog = [];  // 발생한 에러들을 저장할 배열

// 안전한 작업 수행 함수
function safeTask(taskName, taskFunction) {
    try {
        console.log("작업 시작: " + taskName);        // 작업 시작 알림
        let result = taskFunction();                  // 전달받은 함수 실행
        console.log("작업 성공: " + taskName);        // 성공 알림
        return result;                                // 결과 반환

    } catch (error) {
        // 에러 정보를 로그에 기록
        let errorInfo = {
            task: taskName,                           // 작업 이름
            message: error.message,                   // 에러 내용
            time: new Date().toLocaleString()         // 발생 시간
        };
        errorLog.push(errorInfo);                     // 로그 배열에 추가

        console.log("작업 실패: " + taskName + " - " + error.message);  // 실패 알림
        return null;                                  // null 반환
    }
}

// 테스트용 작업들
function goodTask() {
    return "성공적으로 완료되었습니다!";  // 정상 작업
}

function badTask() {
    throw new Error("알 수 없는 문제가 발생했습니다");  // 에러 발생 작업
}

// 작업 실행 및 로그 확인
safeTask("좋은 작업", goodTask);   // 성공하는 작업 실행
safeTask("문제 작업", badTask);    // 실패하는 작업 실행

console.log("\n=== 에러 로그 ===");
errorLog.forEach((log, index) => {  // 각 에러 로그에 대해 반복
    console.log((index + 1) + ". " + log.task + ": " + log.message + " (" + log.time + ")");
});

이 연습문제를 통해 에러 정보를 체계적으로 기록하고 관리하는 방법을 익힐 수 있어요.

🎮 보너스 문제 - 고급 에러 처리 기법

조금 더 어려운 내용이지만, 도전해보고 싶은 분들을 위한 보너스 문제입니다!

보너스 Q1. try...catch와 함수 호출

function mysteryFunction() {
    try {
        console.log("A");
        throw new Error("의도적 에러");
        console.log("B");
    } catch (error) {
        console.log("C");
        return "catch에서 반환";
    }
    console.log("D");
}

let result = mysteryFunction();
console.log("결과: " + result);

정답: "A", "C", "결과: catch에서 반환"이 출력됩니다.

해설: throw문에서 에러가 발생하면 즉시 catch로 넘어가므로 "B"는 출력되지 않아요. catch에서 return을 하면 함수가 끝나므로 마지막 console.log("D")는 실행되지 않아요.

보너스 Q2. 다음 중 더 나은 에러 처리 방법은?

// A번
function methodA(data) {
    try {
        if (!data) {
            return "데이터가 없습니다";
        }
        return "처리 완료: " + data;
    } catch (error) {
        return "문제 발생";
    }
}

// B번
function methodB(data) {
    try {
        if (!data) {
            throw new Error("데이터가 없습니다");
        }
        return "처리 완료: " + data;
    } catch (error) {
        console.log("문제: " + error.message);
        return "기본값";
    }
}

정답: B번이 더 나은 방법입니다.

해설: A번은 에러 상황을 일반적인 조건문으로 처리하고 있어서 try...catch의 의미가 없어요. B번은 에러 상황을 명확히 에러로 처리하고, 에러 메시지를 기록하며, 적절한 기본값을 반환하는 올바른 방법을 보여줘요.

📚 이전 단원 복습하기

10단원을 배우는 여러분을 위해 이전에 배운 내용을 복습해보겠습니다!

복습 문제 1 - 9단원: this와 화살표 함수

// 9단원에서 배운 this와 화살표 함수를 복습해보세요
let student = {
    name: "하늘",
    scores: [90, 85, 95],

    // 일반 함수로 객체 메서드 정의
    showScores: function() {
        console.log(this.name + "의 점수:");

        // 화살표 함수로 콜백 정의 (this 보존)
        this.scores.forEach((score) => {
            console.log("- " + score + "점 (학생: " + this.name + ")");
        });
    },

    // 화살표 함수로 메서드 정의하면? (문제 발생)
    wrongMethod: () => {
        console.log("문제: " + this.name); // this.name이 undefined
    }
};

student.showScores();   // 정상 동작
student.wrongMethod();  // this 문제 발생

복습 포인트: 객체 메서드는 일반 함수로, 콜백은 화살표 함수로 사용하는 것이 좋아요. 화살표 함수는 자신만의 this를 만들지 않고 바깥쪽 환경의 this를 사용한다는 점을 기억하세요!

복습 문제 2 - 4단원: 반복문과 조건문

// 4단원에서 배운 반복문과 조건문을 복습해보세요
console.log("=== 구구단 5단 (조건문 포함) ===");

for (let i = 1; i <= 9; i++) {  // 1부터 9까지 반복
    let result = 5 * i;         // 5에 i를 곱해요

    // 조건문으로 특별한 경우 표시
    if (result >= 25) {
        console.log("5 × " + i + " = " + result + " (큰 수!)");
    } else {
        console.log("5 × " + i + " = " + result);
    }
}

// while문도 사용해보기
console.log("\n=== 카운트다운 ===");
let count = 5;
while (count > 0) {             // count가 0보다 클 때까지 반복
    console.log(count + "...");
    count--;                    // count를 1 감소
}
console.log("완료!");

복습 포인트: 반복문과 조건문은 프로그래밍의 기본입니다. try...catch에서도 이런 기본 구조들을 함께 사용할 수 있어요!

지금까지 try...catch로 에러를 안전하게 처리하는 방법을 배웠습니다. 이제 여러분도 예상치 못한 문제가 생겨도 당황하지 않고 우아하게 해결할 수 있는 안전한 프로그래머가 되었어요!

✅ 학습 완료 체크리스트

이번 시간에 배운 내용들을 모두 이해했는지 확인해보세요!

학습 내용 이해했나요?
try...catch의 기본 개념
기본 사용법과 문법
에러 처리 방법
자주 하는 실수들
실전 예제 이해

🎯 추가 연습 문제들

조금 더 연습하고 싶은 분들을 위한 추가 문제들입니다!

추가 문제 1. 나누기 함수에 try...catch를 적용해보세요.

// 답:
function safeDivide(a, b) {
    try {
        if (b === 0) {
            throw new Error("0으로 나눌 수 없어요!");
        }
        let result = a / b;
        console.log("결과: " + result);
        return result;
    } catch (error) {
        console.log("계산 오류: " + error.message);
        return null;
    }
}

safeDivide(10, 2); // "결과: 5"
safeDivide(10, 0); // "계산 오류: 0으로 나눌 수 없어요!"

추가 문제 2. 간단한 메시지 함수에 try...catch를 적용해보세요.

// 답:
function safeGreeting(name) {
    try {
        let greeting = "안녕하세요 " + name + "님!";
        console.log(greeting);
        return greeting;
    } catch (error) {
        console.log("인사 실패: " + error.message);
        return "안녕하세요!";
    }
}

safeGreeting("영희"); // "안녕하세요 영희님!"

추가 문제 3. 간단한 에러 처리를 해보세요.

// 답:
try {
    console.log("시작!");
    let x = 10;
    let y = someUndefinedFunction(); // 존재하지 않는 함수 호출로 에러 발생
    console.log("이 줄은 실행 안 됨");
} catch (error) {
    console.log("문제 발생: " + error.message);
}
console.log("프로그램 계속 실행");

📂 마무리 정보

오늘 배운 10.1.1 내용이 여러분의 자바스크립트 지식에 잘 저장되었나요? 다음 시간에는 더 흥미로운 내용으로 만나요!

기억할 점: 오늘 배운 내용을 꼭 연습해보시고, 궁금한 점이 있으면 언제든 다시 돌아와서 읽어보세요.


🚀 더 체계적인 JavaScript 학습을 원하신다면?
이 포스팅에서 다룬 내용을 실제로 실습해보세요!
무료 JavaScript 학습 플랫폼에서 단계별 학습과 실시간 코드 실행을 통해
더욱 효과적이고 재미있게 학습하실 수 있습니다.
📝 실시간 코드 실행 📊 학습 진도 관리 👥 체계적 커리큘럼
📚 171개 체계적 학습레슨 · 📋 855개 4지선다 연습문제 · 🆓 완전 무료 · ⚡ 즉시 시작