커스텀에러객체

lee jae hwan·2022년 7월 31일

javascript

목록 보기
73/107

catch블럭에서 에러객체의 유형별로 처리하는것을 보았다.

네트워크관련 HttpError, 데이터베이스관련 DbError, 검색관련 NotFoundError객체와 같은 사용자정의 에러객체를 만들어서 사용하면 직관적으로 보기 좋다.

그러나 Error객체를 상속받아 커스텀에러 클래스를 만들어 사용해도 사용자저의 에러객체처럼 사용할 있으며 obj instanceof Error와 같이 유형검사에 활용할 수 있는 큰 장점이 생긴다. 아래에서 활용을 보자

let json = `{ "name": "John"}`;

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

function readUser (jsonStr){
  try {
    let user = JSON.parse(jsonStr);
    if(user.age == undefined){
      throw new ValidationError("no age property");   
    }
  } catch (error) {
    console.log(error.name, error.message);    
  }
}

readUser(json);

Error내장객체를 상속받은 ValidationError클래스를 정의했다.

if(user.age == undefined) 이외 다른 프로퍼티가 없을때는 if문을 추가해야한다.

그러나 catch블럭에서는 error.message값으로 구분할필요가 없다.

let json = `{ "name": "John"}`;

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

function readUser (jsonStr){
  try {
    let user = JSON.parse(jsonStr);
    if(user.age == undefined){
      throw new ValidationError("no age property");     
    }
    if(user.name == undefined){
      throw new ValidationError("no name property");     
    }
  } catch (error) {
    if(error instanceof ValidationError){
      console.log(error.name, error.message);
    }else if (error instanceof SyntaxError) { 
      console.log(error.name, error.message);    
    }else {
      throw error; // 알려지지 않은 에러는 재던지기 합니다. 
    }
    
  }
}

readUser(json);

ValidationError의 인스턴스라면 묶어서 같은 에러객체로 처리한다.

이처럼 ValidationError객체를 만들면 세분화와 유형구분이 가능하게된다.

그러나 위코드의 단점도 있다.

user속성의 데이터유형검사 프로퍼티검사등 세분화되면 try블럭 가독성이 떨어진다.

let json = `{ "name": "John"}`;

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

class PropertyRequiredError extends ValidationError {
  constructor(property) {
    super("No property: " + property);
    this.name = "PropertyRequiredError";
    this.property = property;
  }
}

function readUser (jsonStr){
  let user = JSON.parse(jsonStr);
  if(user.age == undefined){
    throw new PropertyRequiredError("age");      
  }
  if(user.name == undefined){
    throw new PropertyRequiredError("name");      
  }
  return user;
}

try {
  let user = readUser(json);
} catch (error) {
  if(error instanceof PropertyRequiredError){
    console.log("Invalid data: " + error.message+', property '+error.property);
  }else if(error instanceof SyntaxError){
    console.log("JSON Syntax Error: " + error.message);
  }else{
    throw error; 
  }
}

위와 같이 try블럭에서는 함수로 캡슐화하고 catch블럭에서 에러가 발생된 결과 정보에 집중하여 가독성을 높이는 것이 좋다.

0개의 댓글