try {...}
블록 안의 코드를 실행하고 실행 중에 문제가 없었다면 catch
블록은 건너뛰고 try
블록 이후 나머지 남은 코드를 실행합니다.
try
블록 코드 실행 도중 문제가 생겼다면 발생한 시점에서 try
블록 코드의 실행이 중단되고 바로 catch
블록으로 제어 흐름이 넘어갑니다.
catch
블록에서 사용하는 매개변수는 발생한 에러에 대한 에러 객체를 담고 있습니다.
finally
블록은 에러가 있든 없든 실행되는 블록입니다.
try
블록 실행 도중 에러가 발생하지 않으면 catch
블록을 건너 뛰고 finally
블록을 실행합니다.
try
블록 실행 도중 에러가 발생하면 발생한 시점에서 try
블록 실행을 중단하고 catch
블록 실행 후 finally
블록을 실행합니다.
try
블록 안에 return
문이 존재할 경우 return
하기 전에 finllay
문이 실행됩니다.
try-catch
블록은 runtime error만 캐치하기 때문에 parse-time error(자바스크립트는 실행하기 전에 엔진이 코드를 먼저 읽고 parsing한 후 실행됩니다.)는 처리할 수 없습니다.
runtime error 혹은 exception이라고 부릅니다.
비동기로 동작하는 코드는 실행컨텍스트가 빈 다음에 실행되기 때문에 try-catch
문에서 처리할 수 없습니다.
내장 에러 전체와 에러 객체는 두 가지 주요 프로퍼티를 가집니다.
name
message
stack
자바스크립트는 Error
, SyntaxError
, ReferenceError
, TypeError
등의 표준 에러 객체 관련 생성자를 지원합니다. 따라서 이 생성자를 이용해 에러 객체를 만들 수 있습니다.
위의 내장 생성자를 사용해서 에러 객체를 생성한 경우 에러 객체의 name 프로퍼티 값은 생성자 이름과 동일합니다.
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
를 상속해서 에러 클래스를 작성하는 것이 좋습니다.