개발을 공부하다 보면 인터넷에서 복붙 복붙을 많이 볼 수 있다.
사실 맞는 개념이고 맞는 코드면 복붙을 할 수 있다고 생각한다.
하지만 틀린 개념을 복붙하면 나같은 햇병아리 개발자는 틀린 개념을 가지고 공부를 하게 된다.
그리고 자기들의 생각을 넣으면서 그 글은 점점 더 산으로 가는 가능성이 있을 수 있다.
그래서 아무리 재미없고 읽기 어려워도 공식문서를 찾아서 보게 된다.
이번 글에서는 node js express를 공부하면서 error를 custom으로 할 수 있게되서 찾아봐서 작성을 할려고 한다.
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와 확장 기능을 살펴봤는데.
출처 링크를 꼭 가서 확인해 보고 무슨 내용인지 숙지를 하고 자기 개발 블로그에 글을 올렸으면 좋겠다.이생은 복붙이 아니다.