throw new Error(error) vs throw error

조민호·2023년 8월 14일
2
post-custom-banner

catch 에서 다시 throw 할 때

throw 는 try 부분에서도 사용할 수 있으며 catch에서도 사용이 가능합니다

try 에서 던지는 경우

  • 특정 로직에 따라 의도한 에러가 발생했을 경우 에러를 의도적으로 발생시키기 위해서

catch에서 던지는 경우

  • catch 블록에서 우리가 예상했던 특정 타입의 에러만 처리하고 다른 타입의 에러는 상위 호출자에게 전파하고 싶을 때 (= 에러 다시 던지기 )
  • 에러가 발생했을 때 그 에러의 메시지나 타입이 부적절하거나 충분한 정보를 제공하지 않는다고 판단되면, 새로운 에러 객체를 생성하여 그 정보를 포함하고 throw 하는 경우

  • 에러가 발생했을 때 특정 로직을 수행한 후에도 같은 에러를 계속 전파하고 싶을 때


이 때 , catch 안에서 에러를 던질 때 2가지의 경우에 차이점에 대해서 알아 봅시다.

catch (error) {
    throw new Error(error);
  }
catch (error) {
    throw error;
  }

throw new Error(error);

이 경우에는 새로운 Error 객체를 생성하여 던집니다.

error가 문자열이거나 toString 메서드를 가지고 있는 객체라면, 그 값을 메시지로 사용하여 새로운 Error 객체를 생성합니다.

그렇지만 이 방법은 Error 객체를 새로 생성하므로 원래의
error 로 넘어온 에러 객체의 일부 정보를 잃을 수 있습니다

throw error;

이 경우에는 error 객체 자체를 던집니다.

이것은 catch 블록에서 받은 원래의 에러 객체를 그대로 다시 던지는 것이므로, 원래의 에러 객체에 있던 모든 정보와 속성을 유지합니다.


예시를 봅시다.

아래 코드에서는 CustomError라는 사용자 정의 에러 클래스를 새로 커스텀하고, 그 클래스의 인스턴스를 던집니다.

여기엔 기존 Error 객체와 달리 code라는 추가 속성이 있습니다.

그렇지만 new Error(error) 형태로 에러를 래핑하고 던지면, 원래의 CustomError 객체의 code 속성과 같은 추가 정보는 사라지게 됩니다

post-custom-banner

2개의 댓글

comment-user-thumbnail
2023년 8월 14일

잘 읽었습니다. 좋은 정보 감사드립니다.

답글 달기
comment-user-thumbnail
2024년 6월 25일

GPT한테 물어봤을때는 이해가 안돼서 화가 조금 났었는데 덕분에 이해 했습니다. 감사합니다.

답글 달기