November 8, 2021
개발을 하다 보면 자체 에러 클래스가 필요한 경우가 종종 생깁니다. 네트워크 관련 작업 중 에러가 발생했다면 HttpError
, 데이터베이스 관련 작업 중 에러가 발생했다면 DbError
, 검색 관련 작업 중 에러가 발생했다면 NotFoundError
를 사용하는 것이 직관적이기 때문이죠.
직접 에러 클래스를 만든 경우, 이 에러들은 message
이나 name
, 가능하다면 stack
프로퍼티를 지원해야 합니다. 물론 이런 프로퍼티 이외에도 다른 프로퍼티를 지원할 수 있습니다. HttpError
클래스의 객체에 statusCode
프로퍼티를 만들고 404
나 403
, 500
같은 숫자를 값으로 지정할 수 있을 겁니다.
앞서 배운 바와 같이 throw
의 인수엔 아무런 제약이 없기 때문에 커스텀 에러 클래스는 반드시 Error
를 상속할 필요가 없습니다. 그렇지만 Error
를 상속받아 커스텀 에러 클래스를 만들게 되면 obj instanceof Error
를 사용해서 에러 객체를 식별할 수 있다는 장점이 생깁니다. 이런 장점 때문에 맨땅에서 커스텀 에러 객체를 만드는 것보다 Error
를 상속받아 에러 객체를 만드는 것이 낫습니다.
애플리케이션 크기가 점점 커지면 우리가 만들게 될 커스텀 에러 클래스들은 자연스레 계층 구조를 형성하게 됩니다. HttpTimeoutError
는 HttpError
를 상속받는 식으로 말이죠.
Error
나 다른 내장 에러 클래스를 상속받아 만들 수 있습니다. 이때 super
를 호출해야 한다는 점과 name
프로퍼티를 신경 써야 한다는 점을 잊지 마세요.instanceof
를 사용하면 에러 종류를 판별할 수 있습니다. 상속된 클래스에도 마찬가지죠. 그런데 서드파티 라이브러리에서 온 에러 객체는 클래스를 알아내는 것이 쉽지 않습니다. 이럴 땐 name
프로퍼티를 사용해 오류 종류를 확인할 수 있습니다.err.cause
)로 넘기면 구체적인 에러 정보를 함께 넘겨줄 수 있는데, 반드시 이 프로퍼티가 있어야 하는 것은 아닙니다.