본문 바로가기

[코드팩토리] try...catch

codeConnection 2024. 3. 5.

기본 개념

error를 잡는데 사용한다.

사용 하는 키워드는 아래와 같다.

  • throw : 에러를 발생 시킨다 ☞ 에러를 '던진다'
  • catch : 에러를 명시적으로 인지한다 ☞ 에러를 '잡는다'

throw로 에러를 던지면 그 다음 코드는 실행되지 않는다.

function runner(){
    console.log('hello');
    throw new Error('큰 문제가 생겼습니다!');
    console.log('world'); // 위에서 throw로 에러를 던졌기 때문에 이 코드는 실행되지 않음.
}

runner();

throw로 던진 에러를 catch로 잡을 수 있다.

function runner() {

    try {
        console.log('hello');
        throw new Error('큰 문제가 생겼습니다!'); // 여기서 에러를 throw로 던졌다.
        console.log('world'); // 위에서 throw로 에러를 던졌기 때문에 이 코드는 실행되지 않음.
    }catch(e){ // throw에서 에러를 던지면 바로 catch로 넘어간다. catch의 파라미터로 e로 넣어 에러내용을 잡았고, console.log에 e 내용을 출력하도록 했다.
        console.log(e); 
    }
}

runner();
hello
Error: 큰 문제가 생겼습니다!
    at runner (c:\Users\kim07\OneDrive\바탕 화면\study.js:5:15)
    at Object.<anonymous> (c:\Users\kim07\OneDrive\바탕 화면\study.js:12:1)
    at Module._compile (node:internal/modules/cjs/loader:1376:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1435:10)
    at Module.load (node:internal/modules/cjs/loader:1207:32)
    at Module._load (node:internal/modules/cjs/loader:1023:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:135:12)
    at node:internal/main/run_main_module:28:49

여기에 finally 블록을 더 넣을 수도 있다. 순서는 try{} catch() {} finally {} 순이다.

finally는 try에서 에러가 났든 안 났든 무조건 실행되는 함수로, 가장 마지막에 실행되는 블록이다.

function runner() {

    try {
        console.log('hello');
        throw new Error('큰 문제가 생겼습니다!'); // 여기서 에러를 throw로 던졌다.
        console.log('world'); // 위에서 throw로 에러를 던졌기 때문에 이 코드는 실행되지 않음.
    }catch(e){ // throw에서 에러를 던지면 바로 catch로 넘어간다. catch의 파라미터로 e로 넣어 에러내용을 잡았고, console.log에 e 내용을 출력하도록 했다.
        console.log(e); 
    }finally{ // world 출력을 건너뛰고 catch가 실행된 다음 마지막으로 콘솔에 로그를 띄우게 된다.
        console.log('완료되었습니다.');
    }
}

runner();
hello
Error: 큰 문제가 생겼습니다!
    at runner (c:\Users\kim07\OneDrive\바탕 화면\study.js:5:15)
    at Object.<anonymous> (c:\Users\kim07\OneDrive\바탕 화면\study.js:14:1)
    at Module._compile (node:internal/modules/cjs/loader:1376:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1435:10)
    at Module.load (node:internal/modules/cjs/loader:1207:32)
    at Module._load (node:internal/modules/cjs/loader:1023:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:135:12)
    at node:internal/main/run_main_module:28:49
완료되었습니다.

 

이해를 돕기 위해 다른 예시를 하나 더 들겠다.

function greet(name) {
  try {
    if (typeof name !== 'string') {
      throw '이름은 문자열이어야 합니다.';
    }
    console.log('안녕하세요, ' + name + '님!');
  } catch (error) {
    console.error('인사를 할 수 없습니다:', error);
  } finally {
    console.log('인사가 완료되었습니다.');
  }
}

// greet 함수 호출
greet('장원영'); // 올바른 문자열을 전달하여 함수 실행
greet(123);     // 잘못된 데이터 타입을 전달하여 예외 발생
안녕하세요, 장원영님!
인사가 완료되었습니다.
인사를 할 수 없습니다: 이름은 문자열이어야 합니다.
인사가 완료되었습니다.

 

코드해석

greet라는 함수를 지정하고 파라미터로 name을 받는다.

이 함수의 기능은 try...catch 구문이 사용되었으므로, try에서 에러가 발생하면 catch로 바로 넘어가도록 하게 되어있다.

try 내부를 보니 if문이 쓰였다. 만약 greeting의 인자인 name의 데이터 타입이 string이 아니면(!==) 중괄호 안의 코드인

throw 에러를 던진다. '이름이 문자열이어야 합니다.'라는 에러와 함께.

만약 typeof name이 string이 아닌 게 아니면(즉 name의 데이터 타입이 스트링이 맞으면) 콘솔에 '안녕하세요, name님!'을 출력해라.

만약 try 내에서 에러가 발생하면 throw에서 던지고 그 바로 다음 코드인 안녕하세요 name님은 실행되지 않으며

바로 catch로 에러를 잡게 된다.catch의 파라미터로 error를 잡도록 명명했고, catch로 에러를 잡고 나면 '인사를 할 수 없습니다.'라는 에러 문구를 포함해서 출력하도록 했다.

그리고 try내에서 에러가 발생했든 안 했든 마지막 finally로 넘어가 '인사가 완료되었습니다'라는 문구를 콘솔에 띄우도록 한다.

 

greet의 아규먼트로 '장원영'을 넣었더니 if typeof name !== 'string'이 false다. (name의 데이터타입이 스트링이 아니다 ☞ 스트링이 맞으니 다음 중괄호인 throw 문자열이어야 합니다의 코드를 생략하고  else값인 '안녕하세요 name님' 으로 넘어가게 된다.

그리고 에러가 났든 안 났든 finally는 실행되어야 하기 때문에 인사가 완료되었습니다가 출력되며 코드가 마무리 된다.

 

추가학습. 비교연산자 === (같음), !== (같지 않음)

추가학습. if (조건) {true일 때 실행할 코드} else {거짓일 때 실행할 코드}

if (조건) {
  // 조건이 참일 때 실행될 코드
} else {
  // 조건이 거짓일 때 실행될 코드 (선택적)
}

그러나 위에서는 아래와 같이 작성됐다.

if (조건) {true일 때 실행할 코드}  false일 때 실행할 코드

즉 else와  else 다음의 {} 중괄호는 생략 가능하다.

 

 

출처 : https://youtu.be/ZOVG7_41kJE?si=ujb7usAQFvJMxpp7

 

댓글