코드 내에서 에러가 발생하면 스크립트는 즉시 중단되며 콘솔에 에러가 출력된다.
- try...catch 문법을 통해 스크립트 중단을 방지할 수 있으며 에러를 잡아 합당한 작업을 할 수 있다.
try
, block
두 블록으로 구성
try {
// 코드
} catch (err) {
// 에러 핸들링
}
결론 : try...catch 문법을 사용하면 에러 처리를 별도로 수행하기 때문에 스크립트는 중단되지 않는다.
정의되지 않은 변수를 참조할 때 발생
try {
console.log(userName);
} catch (err) {
console.error(err);
}
// 결과
ReferenceError: userName is not defined
정의되지 않은 name이라는 변수를 출력 시도했기에 참조 관련 오류가 발생했다.
위 코드에선 console.error
를 사용했는데 console.log
와 차이점이 있다.
console.error
를 활용하도록 하자.코드 상 잘못된 문법이 입력되었을 때 발생 // ex) 오타, 쉼표, 따옴표, 괄호 ...
try {
console.log(2023));
} catch (error) {
console.error(error);
}
// 결과
SyntaxError: Unexpected token ')'
2023 정수형 출력 시 괄호가 필요없는 괄호가 더 입력되어 문법 오류가 발생했다.
변수나 매개변수가 유효한 타입이 아닐 때 발생
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
값이 지정된 범위를 벗어났을 때 발생
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
프로그램에서 발생할 수 있는 오류에 대응하는 방법
try - catch - finally 또는 throw 명령문으로 예외 처리 진행
- throw : 발생한 예외 상황에 대해 알려주기 위한 작업. 예외가 발생하면 현재 함수의 실행이 중지되며 throw 이후의 명령문은 실행되지 않는다.
- try - catch - finally : finally는 예외 발생여부에 상관없이 최종적으로 실행될 블록이며, finally 블록은 필요없다면 생략이 가능하다.
let age = 18;
try {
if(age < 19) {
throw '맥주 구매 불가능';
}
console. log('맥주 구매 가능');
} catch (err) {
console.error(err);
}
// 결과
맥주 구매 불가능
성인 판별에 따라 맥주 구매 불가능 여부를 판독하기 위해 작성한 예제이다.
age 변수의 값에 따라 19세 미만이면 throw문이 출력되며 실행이 중지된다.
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