에러 처리

리충녕·2023년 8월 20일
1

Javascript

목록 보기
10/50

📖 에러 처리


에러

코드 내에서 에러가 발생하면 스크립트는 즉시 중단되며 콘솔에 에러가 출력된다.

  • try...catch 문법을 통해 스크립트 중단을 방지할 수 있으며 에러를 잡아 합당한 작업을 할 수 있다.

try...catch 문법

try, block 두 블록으로 구성

try {
  // 코드
} catch (err) {
  // 에러 핸들링
}

try... catch 동작 과정

  1. try{} 내부의 코드 실행
  2. 에러가 없을 경우 try 내부의 코드가 실행되며 catch 블록은 생략
  3. 에러가 있을 경우 tyy 내부의 코드 실행이 중단되며 catch 블록으로 제어 흐름이 넘어감.
  • catch(변수명)의 변수명은 아무 이름이나 사용 가능하며 무슨 일이 발생한지에 대한 설명이 담긴 에러 객체를 포함

결론 : try...catch 문법을 사용하면 에러 처리를 별도로 수행하기 때문에 스크립트는 중단되지 않는다.

자바스크립트 에러 유형


1. ReferenceError

정의되지 않은 변수를 참조할 때 발생

try {
  console.log(userName);
} catch (err) {
	console.error(err);
}
// 결과
ReferenceError: userName is not defined

정의되지 않은 name이라는 변수를 출력 시도했기에 참조 관련 오류가 발생했다.
위 코드에선 console.error를 사용했는데 console.log와 차이점이 있다.

  • 아래 이미지를 보면 console.log로 출력 시 에러 구문이 에러 구문이 검정색 텍스트로 보여지지만 console.error로 출력 시 에러 구문이 빨간색 텍스트로 보여져 에러를 비교적 쉽게 발견할 수 있다는 장점이 있다.
  • 따라서 에러 핸들링 작업시엔 console.error를 활용하도록 하자.

2. SyntaxError

코드 상 잘못된 문법이 입력되었을 때 발생 // ex) 오타, 쉼표, 따옴표, 괄호 ...

try {
  console.log(2023));

} catch (error) {
  console.error(error);
}
// 결과
SyntaxError: Unexpected token ')'

2023 정수형 출력 시 괄호가 필요없는 괄호가 더 입력되어 문법 오류가 발생했다.

3. TypeError

변수나 매개변수가 유효한 타입이 아닐 때 발생

try {
  setInterval(null, 1000);      // setInterval(callback, ms) -> 첫번째 인자가 함수여야함
} catch (error) {
  console.error(error);
}
// 결과
TypeError [ERR_INVALID_ARG_TYPE]: The "callback" argument must be of type function. Received null

setInterval() 메서드를 사용해 예시 코드를 작성했다.
setInterval() 메서드의 파라미터는 함수, ms가 와야하는데 null값이 들어가 발생한 오류이다.


setInterval() : 지정된 시간 간격마다 지정된 기능 반복하기 위해 사용

  • 기본 구조 : setInterval(function, milliseconds);
    • function : 실행할 코드 블록이 작성된 함수
    • millseconds : 함수 호출 사이의 시간 간격 설정, 1000 = 1s

4. RangeError

값이 지정된 범위를 벗어났을 때 발생

const pi = Math.PI;

try {
  console.log(pi.toPrecision(200));
} catch (err) {
  console.error(err);
}
// 결과
RangeError: toPrecision() argument must be between 1 and 100

toPrecision() 메서드를 사용해 예시 코드를 작성했다.
toPrecision() 메서드의 정밀도인 1 ~ 100사이의 값을 벗어나 발생한 오류이다.

toPrecision() : Number 객체를 지정된 정밀도로 문자열 반환

  • 기본 구조 : toPrecision(precision);
const pi = Math.PI;		// 3.141592653589793
console.log(num.toPrecision(3));	// 3.14

5. URIError


예외처리 (Exception)

프로그램에서 발생할 수 있는 오류에 대응하는 방법

try - catch - finally 또는 throw 명령문으로 예외 처리 진행

  • throw : 발생한 예외 상황에 대해 알려주기 위한 작업. 예외가 발생하면 현재 함수의 실행이 중지되며 throw 이후의 명령문은 실행되지 않는다.
  • try - catch - finally : finally는 예외 발생여부에 상관없이 최종적으로 실행될 블록이며, finally 블록은 필요없다면 생략이 가능하다.

throw 예제

let age = 18;

try {
  if(age < 19) {
    throw '맥주 구매 불가능';
  }
  console. log('맥주 구매 가능');
} catch (err) {
  console.error(err);
}
// 결과
맥주 구매 불가능

성인 판별에 따라 맥주 구매 불가능 여부를 판독하기 위해 작성한 예제이다.
age 변수의 값에 따라 19세 미만이면 throw문이 출력되며 실행이 중지된다.

try - catch - finally 예제

let num1 = 10;
let sum = 0;

try {
  console.log(sum = num1 + num2);		//ReferenceError: num2 is not defined
} catch (err) {
  console.error(err);
} finally {
  console.log(`sum : ${sum}`);
}
// 결과
sum : 0;

try 블록 내 num1, num2의 합을 출력하도록 작성하였지만 num2변수는 정의되어있지 않기 때문에 참조 오류가 발생한다.
finally 블록이 있기 때문에 오류 발생 유무 상관 없이 finally 블록 내 명령문이 실행된다.


참고 사이트
ko.javascript

0개의 댓글