예외
란 사용자가 프로그램을 프로그래머의 의도 밖으로 사용한 것을 의미합니다. 프로그래머의 의도에서 벗어난 작동을 시키면 프로그램이 고장나거나, 다양한 오류를 배출할 수 있습니다. 따라서 예외를 처리하는 것은 중요합니다.
물론 코드를 작성하는 과정에서 예외를 막을 수 있지만, 외부 요인(특히 사용자 등)에 의해서 발생하는 예외들은 코드 작성 과정에서 방지하는 것이 쉽지 않습니다. 그래서 이런 외부 요인으로부터 발생하는 예외들을 방지하기 위해 예외 처리 구문
이라는 것이 등장했습니다.
자바스크립트에서 예외가 발생하면, 스크립트를 해석하는 것을 그만두고 에러를 띄웁니다. 스크립트를 정지시키는 것은 여러므로 좋지 못한 행동이기에, 예외 처리 구문을 이용해서 스크립트가 정지하는 상황을 피할 수 있습니다.
try~catch~finally
구문은 예외 처리 구문의 형식입니다. try
는 예외가 발생할 수 있는 코드들을 적고, catch
는 예외가 발생했을 때의 처리를 적습니다. 그리고 finally
는 예외 처리 과정에서 결과가 어떻게 됐든간에 최종적으로 실행할 명령을 적습니다.
try문에서 예외가 발생할 경우 catch 구문을 실행하고, 그렇지 않을 경우 다음 스크립트가 실행됩니다. try~catch~finally
구문은 다음과 같이 사용합니다.
try {
예외가 발생할 수 있는 명령(들)
}
catch (에러 객체) {
예외가 발생할 때의 처리(들)
}
finally {
예외가 발생하거나, 발생하지 않아도 최종적으로 실행될 명령(들)
}
finally
구문은 생략하고 try~catch만 기술할 수도 있습니다.
에러 객체
란, 에러의 종류를 나타내는 객체입니다.
한 번 직접 예외 처리를 해보겠습니다. 다음 코드는 예외 처리 구문이 없이 예외를 발생시키는 코드입니다.
let sum = 0;
let num1 = 2;
sum = num1 + num2;
console.log(sum);
우리가 익히 알고 있듯이 잘못된 문법에 대해서 에러를 내버리고 스크립트가 실행되지 않습니다. 그럼 이번에는 위 코드에 예외 처리 구문을 넣어서 작성해보겠습니다.
let sum = 0;
let num1 = 2;
try {
sum = num1 + num2; //오류가 발생할 가능성이 있음!
}
catch (e) {
console.log(e.message); //오류가 발생할 경우 message출력!
}
finally {
console.log('sum: ' + sum + '\n')
console.log('어쨋든 수행 완료!');
}
예외가 발생했을 때, 예외에 대한 메세지를 보내고 스크립트도 정상적으로 실행되었음을 확인할 수 있습니다.
앞에서 본 바로는 굉장히 안정적이고 좋은 구문같아 보입니다. 실제로 예외에 대해서 확실한 처리를 보장하기도 하고요. 하지만 예외 처리 구문은 처리하는데 시간과 메모리를 많이 소모합니다. 따라서 예외 처리 구문을 너무 남발할 경우 어플리케이션의 성능 저하를 가져올 수도 있습니다.
throw
명령은 예외를 명시적으로 발생시킬 때 사용하는 명령입니다. 일반적으로 다음과 같이 사용합니다.
throw new Error(에러 메세지);
실제 사용은 다음과 같이 사용합니다. 위에서 예외 처리 구문을 연습하면서 작성했던 예제를 조금 바꿔보겠습니다.
let div = 0;
let num1 = 2;
let num2 = 0;
try {
if (num2 === 0) {
throw new Error('0으로 나누기');
}
div = num1 / num2;
}
catch (e) {
console.log(e.message);
}
일반적인 수학에서 정수를 0으로 나누는 것은 불가능합니다. 하지만 컴퓨터는 이에 대해 오류를 발생시키지 않습니다. 그래서 throw
명령을 이용해서 0으로 나눌 경우 명시적으로 오류를 발생시키게하여 catch
구문을 실행되게 만든 것 입니다. 만약 throw
명령이 없는 코드였다면 catch
구문은 실행되지 않습니다.