본문 바로가기

코딩도 합니다/JS

[자바스크립트 js] 에러 / 에러 객체 / 에러 종류 / try catch문



  에러 타입

  • ReferenceError : 존재하지 않는 변수와 함수를 호출할 때 발생.
  • TypeError : 잘못된 형식으로 자료형을 다룰 때 발생.
  • SyntaxError : 문법에 맞지 않는 코드를 작성하면 발생. 코드 실행하기 전에 에러 발생시킴.

 

 

 

  에러 객체

  • 에러가 발생하면, name과 message라는 프로퍼티를 가진 에러 객체가 만들어진다.
  • name : 에러 타입
  • message : 에러 내용

 

 

  의도적으로 에러를 만드는 방법

  • new 키워드와 에러 객체 이름을 딴 함수를 통해 에러 객체를 만들 수 있다.
  • 에러객체를 만든 것이지, 에러를 발생시킨 것은 아니다.
const error = new TypeError('타입 에러가 발생했습니다.');

console.log(error.name); //TypeError
console.log(error.message); //타입 에러가 발생했습니다.

 

 

 

  에러를 직접 발생시키는 방법

  • throw 키워드를 사용하여 에러를 발생시킨다.
throw error;

 

 

 

  에러를 다루는 방법 : try catch문

  • try catch 문은 각각의 코드블록으로 이루어져 있으니, 스코프 생각해서 사용할 것.
  • 실행이 가능한 코드내에서의 에러를 다룬다. (SyntaxError는 실행이 안됨)
  • 실행 가능한 코드에서 발생한 에러를 다루는 과정을 '예외 처리(Exception Handling)'이라고 부른다.
  • 프로그램을 멈추지 않고 에러 후의 코드들을 안전하게 실행시킬 수 있다.
  • try문에서 발생한 에러 객체가 catch문 첫번째 파라미터로 전달된다.
  • try문에서 에러가 발생하지 않으면 catch문의 코드는 실행되지 않는다.
try {
	// 동작시킬 코드
    console.log('에러 전');
    
    const tooktak = '뚝딱';
    console.log(tooktak);
    
    tooktak = 'tooktak'; //이미 지정되어 있는 변수에 다른 값을 넣으려 해서 에러가 발생
    
    const doordie = '두올다';
    console.log(doordie);
} catch (error) {
	// 위 코드에서 에러가 발생했을 때 동작할 코드
    // error 혹은 err 혹은 e로 사용
    //
    console.log('에러 후');
}


// 결과
// 에러 전
// 뚝딱
// 에러 후

// 에러가 발생한 시점부터는 아무런 동작을 하지 않는다.
// 에러가 catch뒤에 있는 error파라미터로 전달된다.
// console.log(error);
// console.log(error.name);
// console.log(error.message);
// 실제 에러처럼 발생시키려면, console.error(error);

 

  • try catch문 활용
function printMembers(members) {
	for (const member of members) {
    	console.log(member);
    }
}

const teamA = ['뚝딱', '두올다', '두잇', '캔두']
printMembers(teamA);

const tooktak = { name : 'tooktak' };
printMembers(tooktak);
// 객체는 for of문을 사용할 수 없어서 에러가 뜬다.

const teamB = ['뚜기', '따기', '도깨비', '방망이']
printMembers(teamB);

위 내용을 아래처럼 변환하면,

function printMembers(members) {
	try {
    	for (const member of members) {
    		console.log(member);
    	}
    } catch (err) {
    	console.error(err);
        alert(`${err.name}가 발생했습니다.');
    }
}

const teamA = ['뚝딱', '두올다', '두잇', '캔두']
printMembers(teamA);

const tooktak = { name : 'tooktak' };
printMembers(tooktak);
// 객체는 for of문을 사용할 수 없어서 에러가 뜬다.

const teamB = ['뚜기', '따기', '도깨비', '방망이']
printMembers(teamB);


// 콘솔에 teamA 다음에 에러 내용이 보여지고 그 후에 teamB의 이름들이 보여진다.

 

 

 

  try catch문은 finally라는 코드 블록을 하나 더 가질 수 있다.  : finally문

  • finally문은 try catch문이 끝난 다음에 최종적으로 실행될 코드를 다룰 때 활용된다.
  • try문에서 에러가 발생하지 않는다면 try문의 코드가 실행된 다음에,
    try문에서 에러가 발생한다면 catch문의 코드가 실행된 다음에 실행할 코드를 finally문으로 작성한다.
try {
  // 실행할 코드
} catch (err) {
  // 에러가 발상했을 때 실행할 코드
} finally {
  // 항상 실행할 코드
}

 

  • finally문은 try문에서 어떤 코드를 실행할 때, 에러 여부와 상관 없이 항상 실행할 코드를 담고 있다.
function printMembers(...members) {
  for (const member of members) {
    console.log(member);
  }
}

try {
  printMembers('뚝딱', '두올다', '캔두');
} catch (err) {
  alert('에러가 발생했습니다!');
  console.error(err);
} finally {
  const end = new Date();
  const msg = `코드 실행을 완료한 시각은 ${end.toLocaleString()}입니다.`;
  console.log(msg);
}

 

 

  • finally문에서 에러가 발생할 경우에는 다시 catch문으로 넘어가지 않는다.
  • 만약 finally문에서도 에러 처리가 필요하다면, try catch문을 중첩해서 활용해야 한다.
try {
  try {
    // 실행할 코드
  } catch (err) {
    // 에러가 발상했을 때 실행할 코드
  } finally {
    // 항상 실행할 코드
  }
} catch (err) {
  // finall문에서 에러가 발생했을 때 실행할 코드
}
728x90