티스토리 뷰

syntax error 구문 오류

문법적으로 유효하지 않은 코드를 해석하려고 시도할 발생하는 오류. 프로그램 실행 전 발생하는 오류로 구문 오류가 있으면 웹 브라우저가 코드를 분석하지 못하므로 실행되지 않음. 오류의 위치를 'HTML.Page.html:6' 이렇게 알려주므로 쉽게 해결할 수 있음.

 

console.log('괄호를 안닫음...'

실행하면

**SyntaxError: missing ) after argument list**

exception 예외 / runtime error 런타임 오류

SyntaxError 외의 모든 에러 TypeError, ReferenceError, RangeErrorr가 예외로 분류됨, 프로그램 실행 중 발생.

- TypeError 

값이 기대하던 자료형이 아니라서 연산을 할 수 없을 때 발생하는 오류

  • 함수에 전달된 피연산자 또는 인수가 해당 연산자나 함수가 예상하는 타입과 호환되지 않거나,
  • 변경할 수 없는 값을 수정하려고 하거나,
  • 부적절한 방법으로 값을 사용하려고 할 때.

- ReferenceError

현재 범위에서 존재하지 않거나 초기화되지 않은 변수를 참조했을 발생하는 에러.

- RangeErrorr

어떤 값이 집합에 없거나 허용되는 범위가 아닐 때. 어떤 값을 값이 포함되는 범위를 허용하지 않는 함수에 인수로 전달하려

기본예외처리

예외가 발생하지 않게 사전에 해결하는 것

<body>
  
</body>
<script>
  const h1 = document.querySelector('h1')
  h1.textContent = '안녕하세요.'
</script>

<body>
  
</body>
<script>
  const h1 = document.querySelector('h1')
  
  // h1이 존재하면 true로 변환되고, 존재하지 않으면 false로 변환된다.
  if(h1) {
    h1.textContent = '안녕하세요.'
  } else {
    console.log('h1 태그를 추출할 수 없습니다.')
  }
</script>

고급예외처리

try catch finally

실행할 코드블럭을 표시하고 예외(exception) 발생(throw) 경우의 응답을 지정

try {
	// 예외가 발생할 가능성이 있는 코드
} catch (exception) {
	// 예외가 발생했을 때 실행할 코드
} finally {
	// 무조건 실행할 코드
}

finally 구문은 필요한 경우에만 사용함. catch나 finally 블록은 생략 가능. 하지만 try 블록은 catch나 finally 중 적어도 하나 이상의 블록과 함께 사용되어야만 함.

*try, catch, finally 블록은 모두 중괄호로 시작하여 중괄호로 끝남. 이들 중괄호는 필수로 요구되는 문법의 일부로서 생략할 수 없음.

 

❗️finally 구문은 예외 발생 여부와 상관없이 무조건 실행됨!

예외 객체

try catch 구문에서 catch의 괄호 안에 입력하는 식별자를 예외 객체 라고 한다. 일반적으로는 e 또는 exception 식별자를 사용한다. 예외 객체의 속성은 브라우저마다 다른데 공통적으로 사용하는 것은 아래의 3개가 있다.

속성 이름 설명
message 예외 메세지
description 예외 설명
name 예외 이름

이러한 식별자는 오직 catch 블록 내부에서만 존재하는 지역변수. 이 식별자를 통해, 발생한 예외의 정보를 알아낼 수 있음

https://webclub.tistory.com/71

1.  try catch 구문 내부에서 return 키워드를 만날 때

ㄱ. try catch

const test = () => {
  try {
    console.log("A 위치");

    // throw 키워드는 예외를 강제로 발생시킨다.
    throw "예외 강제 발생";
  } catch (exception) {
    console.log("B 위치");
    return;
    // catch 블록은 throw 명령문이 던진 예외의 값을 식별자 exception에 담았음
  }
  console.log("C 위치");
};

// 함수 호출
test();

 

A 위치
B 위치

try...catch는 성공하길 바라는 코드(try 블록)가 만약 실패하면 catch로 제어권을 넘겨야 할 때 사용.

try 블록의 명령문  하나에서 예외를 던지면, 실행 제어권은  즉시 catch 블록으로 넘어간다.

try 블록 내에서 예외가 발생하지 않았으면 catch 블록은 실행되지 않는다.

catch 블록에 진입해야 예외의 식별자를 생성하고, catch 블록의 밖으로 나가면 식별자를 이상 유지하지 않는다.

, catch 블록의 실행이 끝나면 예외 식별자에 접근할 없다.

 

ㄴ. try catch finally

const test = () => {
  try {
    console.log("A 위치");
    throw "예외 강제 발생";
  } catch (exception) {
    console.log("B 위치");
    return;
  } finally {
    console.log("C 위치");
  }
};

// 함수 호출
test();

실행하면

A 위치
B 위치
C 위치

첫번째 코드는 "A 위치 B 위치" 만 출력한다. return 키워드를 사용해 함수를 벗어났으므로 "C 위치" 라는 글자를 출력하지 않는다.

두번째 코드는 "A 위치 B 위치 C 위치" 를 모두 출력한다. 이는 finally 구문을 반드시 실행한다는 특성 때문이다.

 

https://codevang.tistory.com/211

 

메소드 내 예외처리(try-catch-finally)에서의 리턴 처리

1. try 구문 내에서 리턴에 도달했을 경우 try 내에서 리턴에 정상적으로 도달하였으므로, 리턴시킬 값을 임시 저장한 뒤 바로 finally 문을 최종 실행시키고 메소드를 종료합니다. 실제 리턴은 finall

codevang.tistory.com

https://milkye.tistory.com/367

 

[Java] try-catch-finally 반환값(return) 이해하기

코드를 작성하다 보면 예외처리를 위해 try-catch 구문을 굉장히 많이 사용 한다. 그러다 특별한 경우에 finally를 사용하게 되는데 만약 이 세 곳에 다 return 값이 있다면? 어떤 구문에 있는게 반환이

milkye.tistory.com

2.  try catch 구문 내부에서 break 또는 continue 키워드를 만날 때

var i = 0, total = 0;
while (i < a.length) {
	try {
		if(typeof a[i] != 'number' || isNaN(a[i])) { // 만일 이것이 숫자가 아니라면
			continue; // 이 루프의 다음 반복으로 넘어간다.
		}
		total += a[i]; // 숫자라면 total에 이 숫자를 더한다.
	} finally {
		i++; // 위에서 continue 를 사용했지만 무조건 i를 증가시키도록 한다.
	}
}

try와 finally는 catch가 없어도 함께 쓰일 수 있습니다.

이러한 경우 try 절에서 try, continue, return 문 등이 실행된 것과 관계없이, finally 블록은 그저 무조건 실행이 보장되는 뒷정리 코드의 역할을 하게 됩니다.

예를 들어 다음의 코드에서는 루프 카운터 변수가 정상적으로 증가될 수 있게 try/finally 문을 사용하고 있습니다.

설사 continue 문에 의해 루프 반복이 갑자기 끝났다 하더라도 루프 카운터 변수는 증가되는 코드입니다.

 

https://webclub.tistory.com/71

 

예외 처리 - throw 및 try/catch/finally

throw & try/catch/finally(Exception Handling) 이 글에서는 예외 처리 방식에 대해 알아봅니다. 프로그램이 실행되는 동안 문제가 발생하면 프로그램이 자동으로 중단됩니다. 이럴 경우에 프로그램이 대처

webclub.tistory.com