[Javascript] 예외 처리 try~catch

Bam·2022년 2월 24일
0

Javascript

목록 보기
29/106
post-thumbnail
post-custom-banner

예외 처리

예외란 사용자가 프로그램을 프로그래머의 의도 밖으로 사용한 것을 의미합니다. 프로그래머의 의도에서 벗어난 작동을 시키면 프로그램이 고장나거나, 다양한 오류를 배출할 수 있습니다. 따라서 예외를 처리하는 것은 중요합니다.

물론 코드를 작성하는 과정에서 예외를 막을 수 있지만, 외부 요인(특히 사용자 등)에 의해서 발생하는 예외들은 코드 작성 과정에서 방지하는 것이 쉽지 않습니다. 그래서 이런 외부 요인으로부터 발생하는 예외들을 방지하기 위해 예외 처리 구문이라는 것이 등장했습니다.

자바스크립트에서 예외가 발생하면, 스크립트를 해석하는 것을 그만두고 에러를 띄웁니다. 스크립트를 정지시키는 것은 여러므로 좋지 못한 행동이기에, 예외 처리 구문을 이용해서 스크립트가 정지하는 상황을 피할 수 있습니다.

try~catch~finally

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명령은 예외를 명시적으로 발생시킬 때 사용하는 명령입니다. 일반적으로 다음과 같이 사용합니다.

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구문은 실행되지 않습니다.

post-custom-banner

0개의 댓글