• ✏️ 예외처리 throw, try와 catch 그리고 finally

    2023. 10. 18.

    by. 서카츄

     

     

    프로그램이 실행되는 동안 문제가 발생하면 프로그램이 자동으로 중단된다.

    이럴 경우 프로그램이 대처할 수 있도록 처리해 주는 것이 `예외처리(Exception Handling)`라고 한다.

    프로그램 실행 중에 발생하는 오류를 `예외(Exception)`라고 하고, 프로그래밍 언어의 문법적인 오류를 `에러(Error)`라고 한다.

     

    예외가 발생하는 이유는 여러가지가 있지만 일반적으로 잘못된 코드를 작성했거나

    사용자가 개발자가 원하지 않는 방향으로 프로그램을 사용했을 수 있다.


    예외는 `기본 예외 처리`와 `고급 예외 처리` 두 가지 방법으로 처리한다.
    예외가 발생하지 않게 사전에 해결하는 것을 `기본 예외 처리`라고 하며 대개 `조건문`으로 처리할 수 있다.
    예외 처리 방법 중에 `고급 예외처리` 하는 방법에 대해 알아보자.

     

     

     

    throw

    `예외`란 무언가 예외적인 상황이나 에러가 발생했음을 가리키는 신호이다.
    예외를 발생시키다(throw)라는 것은 그런 에러나 예외 상황을 알린다는 뜻이다.

     

    한편 예외를 '잡아내다(catch)'라는 것은 그것을 처리한다는 뜻이다.

    즉, 그 예외에서 회복하기 위해 무언가 필요하거나 적절한 행동을 취한다는 뜻


    자바스크립트는 런타임 에러가 일어날 때마다 예외를 발생시키고 프로그램에서 throw문을 사용하여 명시적으로 예외를 발생시킬 때에도

    예외를 발생시킨다.


    이렇듯 예외를 강제로 발생시켜야 경우가 생길 때는 throw 키워드를 사용한다.
    그리고 예외를 잡아내는 데에는 `try`, `catch`, `finally`문을 사용한다.
    throw 문의 문법은 다음과 같다.

    throw 표현식;

     

    `표현식`의 결과값 타입은 무엇이든 될 수 있다.

    하지만 대부분의 그 타입은 `Error`객체 또는 `Error`의 하위 클래스 중 하나의 인스턴스가 되곤 한다. 
    때때로 에러 메시지를 담고 있는 문자열이나 어떤 에러 코드를 나타내는 숫자 값도 유용할 수 있다.
    다음의 예제 코드에서 예외를 발생시키는 throw 문이 어떻게 쓰이는지 살펴본다.

     

     

     

     

     

    예제 코드

    function factorial(x) {
    	// 만약 전달인자가 유효하지 않으면 예외를 발생시킨다!!!
    	if (x < 0) {
    		throw new Error('x는 음수가 아니어야 합니다.')
    	}
    	// 유효하다면 값을 계산하여 정상적으로 반환환다.
    	for (var f = 1; x > 1; f *= x, x--) /* 비어 있음 */
    	return f;
    }

     

    예외가 발생하면 자바스크립트 인터프리터는 정상적인 프로그램 실행을 즉시 중단하고 가장 가까운 예외 처리기로 넘어간다.
    예외 처리기는 앞으로 다룰 `try`, `catch`, `finally` 문 중에서 `catch`절을 사용하여 작성된다.

     
    예외를 발생시켰던 코드 블록이 `catch`절과 연결되어 있지 않으면, 인터프리터는 바로 상위 단계를 감싸고 있는 코드 블록에 연결되어 있는지를 확인한다. 처리기를 찾을 때까지 이 과정이 반복된다.


    만일 예외를 처리할 `try`, `catch`, `finally` 문이 없는 함수 안에서 예외가 발생했으면, 해당 함수를 호출했던 블록으로 그 예외가 전파되어 올라간다.


    이 같은 방법으로 자바스크립트의 언어적인 구조를 따라서,

    즉 `호출 스택(call stack)`을 따라서 예외가 전파되어 올라간다.

    그래도 아무런 예외 처리기도 찾을 수 없으면 이 예외는 에러로 취급되어 사용자에게 보고된다.

     

    예외를 강제로 발생시키는 이유?

    객체를 잘못 사용하는 사용자에게 예외를 강제로 발생시켜서 사용자에게 주의를 줄 수 있고
    예외와 관련된 처리를 해달라고 부탁할 수 있다.

     

     


     

    try & catch & finally

    `try` `catch` `finally` 문은 자바스크립트의 예외 처리 기법이다.
    이 문장에서 try 절은 그저 처리할 예외가 발생할지도 모를 코드 블록을 정의하는 역할을 한다.

    try 블록 다음에는 catch절이 이어진다.


    `catch`나 `finally` 블록은 생략할 수 있다.

    하지만 `try` 블록은 `catch`나 `finally` 중 적어도 하나 이상의 블록과 함께 사용되어야 한다.
    try, catch, finally 블록은 모두 중괄호로 시작하여 중괄호로 끝나는데, 이들 중괄호는 필수로 요구되는 문법의 일부로서 생략할 수 없다.
    설사 해당절에 단 하나의 문장만 있다 하더라도 생략이 불가능하다.

     

    `catch`절은 `try` 블록 내부에서 예외가 발생할 경우 호출되는 문장 블록이다.
    `catch` 절 다음에는 `finally` 블록이 이어지는데, 여기에는 앞서 `try` 블록에서 일어난 일에 관계없이 `항상 실행이 보장`되어야 할 뒷정리용 코드가 포함된다.

     

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

     

     

    try
    정상이라면 이 코드는 아무런 문제없이 블록의 시작부터 끝까지 실행된다.
    하지만 경우에 따라 예외가 발생할 수 있다. 
    예외는 throw 문에 의해 직접적으로 발생할 수도 있고, 또는 예외를 발생시키는 메서드의 호출에 의해 발생할 수도 있다.

     

    catch
    이 블록 내부의 문장들은 오직 try 블록에서 예외가 발생할 경우에만 실행된다. 
    이 문장들에선 지역 변수 e를 사용하여 Error 객체 또는 앞에서 던진 다른 값을 참조할 수 있다.
    이 블록에서는 어떻게든 그 예외를 처리할 수도 있고, 그냥 아무것도 하지 않고 예외를 무시할 수도 있고,
    아니면 throw 를 사용해서 예외를 다시 발생시킬 수도 있다.

     

    finally
    이 블록에는 try 블록에서 일어난 일에 관계없이 무조건 실행될 코드가 위치한다.
    이 코드는 try 블록이 어떻게든 종료되면 실행된다.

    try 블록이 종료되는 상황은 다음과 같다.
    1) 정상적으로 블록의 끝에 도달했을 때
    2) break, continue 또는 return 문에 의해서
    3) 예외가 발생했지만 catch 절에서 처리했을 때
    4) 예외가 발생했고 그것이 잡히지 않은 채 퍼져나갈 때

     

     

     

     


     

    참고한 블로그

     

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

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

    webclub.tistory.com

     

    댓글