JavaScript - 구문 오류와 예외

최범관·2023년 4월 27일
0

오류

프로그래밍 언어의 오류(error)에는 크게 2가지 종류가 있다.

  • 구문 오류 : 프로그램 실행 전에 발생하는 오류
  • 예외/런타임 오류 : 프로그램 실행 중에 발생하는 오류

구문오류

코드에 잘못된 철자가 있다면 발생하는 오류이다.
프로그램이 아예 구동하지 못하거나 중간에 멈추는 현상을 야기한다.

console.log("Hello")
console.log("안녕하세요"

예시로 함수 뒤에 괄호를 닫지 않고 실행했을 시 구문오류가 발생한다.

caught SyntaxError: missing ) after argument list

런타임 오류 / 예외

console.log("Hello")
console.rog("안녕하세요")

이번에는 오탈자를 입력했을 시 예시이다.
이번에도 마찬가지로 오류를 출력하나, 코드는 실행이 된 직후 오류를 발생시킨다.

Hello
Uncaught TypeError: console.rog is not a function

이처럼 실행중에 예기치 못한 상황이 발생하여 진행할 수 없는 상황이 되었을 때 발생하는 오류가 예외이다.
자바스크립트에서는 SyntaxError라고 출력되는 오류 외 모든 오류(TypeError, ReferenceError, RangeError)가 예외로 분류된다.

예외 처리

코드 실행 중 예기치 못한 에러가 발생했을 때, 코드의 실행 흐름을 복구할 수 있는 기능이 내장되어 있는데, 이 기능을 아울러 예외 처리라고 부른다.

예외를 처리하기 위해 자바스크립트를 포함한 대부분의 프로그래밍 언어는 try-catch 구문을 제공해 예외를 처리할 수 있도록 해준다.

아래는 try-catch 구문의 기본 문법

try{
  // 1) 이 코드에서 오류가 발생하면
  // 2) 발생하지 않는다면
} catch (e) {
  // 1) 여기 있는 코드를 실행하고
  // 2) 여기 있는 코드를 실행 하지 말아주세요
} finally {
  // 3) 여기 있는 코드는 무조건 실행해주세요
}

아래 예제는 선언되어 있지 않은 변수의 메서드를 호출해 오류를 발생한다.

try {
    arr.method() 
} catch (e) {
    console.log(e)
} finally {
    console.log("무조건 실행되는 코드")
}

try 구문에서 선언되어 있지 않은 변수의 메서드를 호출했으니 catch 구문에서는 이 오류를 잡아(catch) catch 구문의 코드를 실행시키게 된다.
finally 구문은 무조건 실행되는 블록이기 때문에 finally 구문의 코드를 실행하게 되는 것이다.

실행결과
ReferenceError: arr is not defined at <anonymous>:2:5
무조건 실행되는 코드

여기서 의문이 하나 생기게 된다.

"finally 구문은 왜 쓰는거지?"

catch 구문에 finally 구문의 코드를 넣어도 결과가 비슷하게 나올 수 있지 않을까라는 생각을 하게 되는데, catch 구문 내부에서 return 키워드나 break, continue 키워드를 만났을 때에는 결과가 달라지게 된다.

아래 예제를 예시로 들면

(function test() {
  try {
    console.log("첫번째 실행")
    throw new Error("에러 발생") // throw 키워드로 에외를 강제로 발생시킴
  } catch (e) {
    console.log("두번째 실행")
   	return
  }
  console.log("마지막 실행")
})()

finally 구문을 사용하지 않았을 때에는 return 키워드를 만나 함수 내부에서 빠져나오게 되어 "마지막 실행" 이라는 콘솔 로그 함수가 실행되지 않는것을 확인할 수 있다.

아래 예제에서 finally 구문을 사용했을 때 return 키워드를 만나면 어떻게 동작하는지 알아보도록 하자

(function test() {
  try {
    console.log("첫번째 실행")
    throw new Error("에러 발생") // throw 키워드로 에외를 강제로 발생시킴
  } catch (e) {
    console.log("두번째 실행")
   	return
  } finally {
  	console.log("마지막 실행")
  }
})()

finally 구문을 사용했을때는 우리가 의도했던대로 "마지막 실행"이 콘솔창에 출력되는 것을 확인할 수 있다.

브라우저에서 사용하는 자바스크립트에서는 쓸모가 없지만, Node.js와 같이 서버로 사용하는 자바스크립트에서는 이러한 내용을 기억해야 견고한 코딩을 할 수 있다.

예외 객체

코드 실행중에 예기치 못한 상황이 발생하여 진행할 수 없는 상황이 되었을 때 발생하는 오류가 예외이다.

이러한 예외가 발생했을 때 정보를 확인할 수 있게 해주는 것이 예외 객체이다.

또, try-catch 구문에서 catch의 매개변수의 인자로 전달되는 값이 예외 객체이다.

예외 객체가 가지고 있는 속성은 브라우저에 따라서 조금씩 다르나, 모든 웹 브라우저가 공통적으로 가지고 있는 속성은 namemessage가 있다.

try{
  console.rog("hello")
} catch (e) {
  console.log(e.name)
  console.log(e.message)
}

name은 예외의 이름, message는 예외 메시지이다.

실행결과
TypeError
console.rog is not a function

throw

상황에 따라 예외를 강제로 사용자가 발생시켜야 하는 경우도 있다.
그럴 때 throw 키워드가 사용된다.

// 단순 예외 발생
throw "문자열"
// ------------------------------------------------
// 더 자세한 예외 발생
throw new Error("문자열")

실행결과
Uncaught 문자열
Uncaught Error: 문자열 at <anonymous>:1:7

0개의 댓글