[TIL]Custom Error and Extends. 커스텀 에러와 에러 확장

Calvin Park·2022년 8월 4일
0

개발을 공부하다 보면 인터넷에서 복붙 복붙을 많이 볼 수 있다.
사실 맞는 개념이고 맞는 코드면 복붙을 할 수 있다고 생각한다.
하지만 틀린 개념을 복붙하면 나같은 햇병아리 개발자는 틀린 개념을 가지고 공부를 하게 된다.
그리고 자기들의 생각을 넣으면서 그 글은 점점 더 산으로 가는 가능성이 있을 수 있다.
그래서 아무리 재미없고 읽기 어려워도 공식문서를 찾아서 보게 된다.
이번 글에서는 node js express를 공부하면서 error를 custom으로 할 수 있게되서 찾아봐서 작성을 할려고 한다.

custom error을 쓰는 이유

  • 개발을 하다 보면 자체 에러 클래스가 필요한 경우가 있을 수도 있다. 네트워크 관련 작업 중 에러가 발생했다면 HttpError, 데이터베이스 관련 작업중 에러가 발생했다면 DBError, 검색 관련 작업 중 에러가 발생했다면 NotFoundError를 사용하는 것이 직관적이기 때문이다.
    직접 에러 클래스를 만든 경우, 에러들은 message이나 name, 가능 하면 stack property를 지원해야 한다.
    throw의 인수엔 아무런 제약이 없기에 custom error class는 반드시 Error를 상속받을 필요는 없다. 하지만, 상송을 받는다면, obj instanceof Error를 상요해서 에러 객체를 구분 (식별)을 할 수 있다. 그러므로 상속을 받는 편이 훨신더 좋다.
    애플리케이션이 점점 커지면서, 우리가 만들게 될 custom Error Class들은 자연스럽게 상속을 받는다.(계층 구조를 형성하게 된다.) -> HttpTimeoutError는 HttpError를 상속받는 식으로.

에러를 확장하는 방법

  • 확장하기 전에 무슨 에러가 발생했는지 중요하다.
    예를 들어서 사용자 데이터가 저장된 JSON을 읽는 함수 readUer(json)이 있다고 치자,
let json = `{ "name": "John", "age": 30 }`;

readUser 내부에서는 JSON.parse를 이용하게 된다. 그러므로 잘못된 json형식이 들어오면 SyntaxError가 발생한다.
하지만, 요유한 사용자일 것이라는 보장은 없다. 만약에 사용자 데이터라면 필수적으로 있어야 할 데이터가 누락 될 수 있다는 것이다.
그러므로 데이터를 '검증(validate check)'가 필요한것이다.
필수 property가 없거나, 형식에 맞지 않으면 에러를 발생시킬 수 있어야 한다.
이럴때 발생하는 에러는 SyntaxError가아닌 전혀 다른 종류의 에러이다. 그 에러를 validationError라고 칭하면, 이제 ValidationError를 위한 class를 만들어 보자

ValidationError Class는 Error Class에서 상속을 받아야 한다.
에러 클래스는 요렇게 생겼다

// 자바스크립트 자체 내장 에러 클래스 Error의 '슈도 코드'
class Error {
  constructor(message) {
    this.message = message;
    this.name = "Error"; // (name은 내장 에러 클래스마다 다릅니다.)
    this.stack = <call stack>;  // stack은 표준은 아니지만, 대다수 환경이 지원합니다.
  }
}

이제 Error class를 ValidationError에서 상속을 받겠다

class ValidationError extends Error {
  constructor(message) {
    super(message); // (1)
    this.name = "ValidationError"; // (2)
  }
}

function test() {
  throw new ValidationError("에러 발생!");
}

try {
  test();
} catch(err) {
  alert(err.message); // 에러 발생!
  alert(err.name); // ValidationError
  alert(err.stack); // 각 행 번호가 있는 중첩된 호출들의 목록
}

⭐️ super는 반드시 호출을 해야 한다.
must call super constructor 에러가 난다. 왜?? 자바스크립트에서는 하위 생성자(child)에서 super호출하는 것을 요구한다.
부모 생성자에선 message뿐만 아니라 name property에서도 설정("Error")를 하기 때문에.
(2)에서 원하는 값으로 재설정해 준다.

Must call super constructor in derived class before accessing 'this' or returning from derived constructor

마무리:
이렇게 간단하게 custom error와 확장 기능을 살펴봤는데.
출처 링크를 꼭 가서 확인해 보고 무슨 내용인지 숙지를 하고 자기 개발 블로그에 글을 올렸으면 좋겠다.이생은 복붙이 아니다.

출처 링크

profile
Personal Velog Note

0개의 댓글