에러핸들링(try...catch...finally, 에러 객체, 커스텀 에러)

정민교·2023년 6월 29일
0

javascript

목록 보기
16/16

✔️try...catch 문법

try {...} 블록 안의 코드를 실행하고 실행 중에 문제가 없었다면 catch 블록은 건너뛰고 try 블록 이후 나머지 남은 코드를 실행합니다.

try 블록 코드 실행 도중 문제가 생겼다면 발생한 시점에서 try 블록 코드의 실행이 중단되고 바로 catch블록으로 제어 흐름이 넘어갑니다.

catch 블록에서 사용하는 매개변수는 발생한 에러에 대한 에러 객체를 담고 있습니다.

📌finllay 블록

finally 블록은 에러가 있든 없든 실행되는 블록입니다.

try 블록 실행 도중 에러가 발생하지 않으면 catch 블록을 건너 뛰고 finally 블록을 실행합니다.

try 블록 실행 도중 에러가 발생하면 발생한 시점에서 try 블록 실행을 중단하고 catch 블록 실행 후 finally 블록을 실행합니다.

try 블록 안에 return 문이 존재할 경우 return 하기 전에 finllay 문이 실행됩니다.

📌runtime error만 처리 가능

try-catch 블록은 runtime error만 캐치하기 때문에 parse-time error(자바스크립트는 실행하기 전에 엔진이 코드를 먼저 읽고 parsing한 후 실행됩니다.)는 처리할 수 없습니다.

runtime error 혹은 exception이라고 부릅니다.

📌비동기로 동작하는 코드에서 발생한 error는 처리 불가

비동기로 동작하는 코드는 실행컨텍스트가 빈 다음에 실행되기 때문에 try-catch문에서 처리할 수 없습니다.

✔️에러 객체

내장 에러 전체와 에러 객체는 두 가지 주요 프로퍼티를 가집니다.

  • name
    에러 이름
  • message
    에러 내용을 담고있는 문자열 메시지
  • stack
    비표준 프로퍼티지만 현재 호출 스택을 문자열로 보여줍니다.

📌표준 에러 객체

자바스크립트는 Error, SyntaxError, ReferenceError, TypeError 등의 표준 에러 객체 관련 생성자를 지원합니다. 따라서 이 생성자를 이용해 에러 객체를 만들 수 있습니다.

위의 내장 생성자를 사용해서 에러 객체를 생성한 경우 에러 객체의 name 프로퍼티 값은 생성자 이름과 동일합니다.

📌throw 연산자를 통한 에러 발생과 되던지기

throw 연산자와 생성한 에러 객체를 사용하여 에러를 발생시킬 수 있습니다.

try 블록에서 의도적으로 throw를 통해 발생시킨 에러는 catch 블록에서 처리됩니다.

catch 블록에서도 throw 연산자를 사용할 수 있습니다.

catch 블록에서 throw 연산자를 사용해서 에러를 발생시키면 다시 에러를 re-throwing 합니다.

현재 cathch 블록 안에서 처리 방법을 알지 못하는 에러라면 되던지기를 통해 에러를 처리할 수 있는 곳으로 던져야합니다.

📌에러 타입 확인

instanceof 연산자로 발생한 에러 타입을 확인할 수 있습니다.

에러 타입을 확인해서 현재 catch 블록에서 처리할 수 있는 에러인지 확인이 가능합니다.

err.name 프로퍼티로 에러 클래스 이름을 알 수도 있습니다. 기본형 에러는 모두 err.name 프로퍼티를 가집니다.

err.contructor.name을 사용할 수도 있습니다.

✔️커스텀 에러

직접 에러 클래스를 만들어서 에러를 생성할 수 있습니다.

직접 에러 클래스들을 만들 경우에는 내장 에러와 호환되도록 message, name 프로퍼티를 지원해야 하고, 가능하다면 stack 프로퍼티도 지원해야 합니다.

Error를 상속해서 클래스를 만들 필요는 없지만 obj instanceof Error 처럼 Error 타입의 객체로서 식별할 수 있는 장점이 있고, 자동으로 stack 프로퍼티도 쓸 수 있으니 Error 를 상속해서 에러 클래스를 작성하는 것이 좋습니다.

profile
백엔드 개발자

0개의 댓글