21

더글러스 크록 포드는이 같은 일을 권장합니다Javascript에서 사용자 지정 예외를 throw하는 중입니다. 어떤 스타일을 사용해야합니까?

throw { 
    name: "System Error", 
    message: "Something horrible happened." 
}; 

을하지만이 같은 것을 할 수있는 :

function IllegalArgumentException(message) { 
    this.message = message; 
} 

throw new IllegalArgumentException("Argument cannot be less than zero"); 

을 다음과 같이하십시오

try { 
    //some code that generates exceptions 
} catch(e) {  
    if(e instanceof IllegalArgumentException) { 
     //handle this 
    } else if(e instanceof SomeOtherTypeOfException) { 
     //handle this 
    } 
} 

을 나는 당신이있을 수 있습니다 생각 type 속성을 확인한 다음 instanceof을 수행하는 대신이를 검사하십시오. 그 중 하나를 다른 것에 비해 어떤 이점이 있습니까?

+3

Java 스타일 예외에 익숙한 사람에게는 두 번째 형식이 훨씬 익숙해졌습니다. – NullUserException

+1

예, 바로 그 이유 때문에 두 번째 부분입니다. :) –

+4

코드 순도 측면에서 재사용이 가능하기 때문에 두 번째 코드를 선호합니다. 정확히 말하자면, 같은 예외 타입을 여러 곳에서 던지려한다면, 첫 번째 접근법으로 코드가 엉망이 될 것입니다. – bellpeace

답변

24

대부분의 JavaScript 환경은 예외의 기초로 Error object을 제공합니다. 이미 메시지를 정의 할 수 있지만 예외의 컨텍스트를 추적하는 데 유용한 스택 등록 정보도 제공합니다. 프로토 타입 상속을 사용하여 고유 한 예외 유형을 만들 수 있습니다. 이미 여러 가지 stackoverflow 토론 (예 : here)이 제대로 수행하는 방법. 그러나, 나는 정확하고 현대적인 접근법을 발견 할 때까지 조금씩 파 내야 만했다. Mozilla 문서 (위 참조)에서 제안 된 접근 방식은 stackoverflow 커뮤니티에서 좋아하지 않습니다. 많은 독서 끝에 Error.prototype에서 상속 한 접근 방식이 나왔습니다.

function IllegalArgumentException(sMessage) { 
    this.name = "IllegalArgumentException"; 
    this.message = sMessage; 
    this.stack = (new Error()).stack; 
} 
IllegalArgumentException.prototype = Object.create(Error.prototype); 
IllegalArgumentException.prototype.constructor = IllegalArgumentException; 
4

코드 순도 측면에서 재사용이 가능하므로 두 번째 코드를 선호합니다. 정확히 말하자면, 동일한 예외 (다른 메시지가있는 동일한 예외 유형조차도)를 여러 곳에서 던지려한다면, 첫 번째 접근 방식으로 코드가 엉망이 될 것입니다.