적절한 오류 사용


155

나는 상당히 큰 프로젝트에 TypeScript를 사용하고 있으며 Errors를 사용하기위한 표준이 무엇인지 궁금합니다 . 예를 들어 Java에서 범위를 벗어난 예외를 색인으로 전달한다고 가정 해보십시오.

throw new IndexOutOfBoundsException();

TypeScript의 해당 문장은 다음과 같습니다.

throw new Error("Index Out of Bounds");

다른 어떤 방법으로이 작업을 수행 할 수 있습니까? 허용되는 표준은 무엇입니까?

답변:


167

누군가가이 링크를 MDN에 댓글로 올렸는데 도움이되었다고 생각합니다 . ErrorTypes와 같은 것들을 매우 철저하게 설명합니다.

EvalError --- 전역 함수 eval ()과 관련하여 발생하는 오류를 나타내는 인스턴스를 만듭니다.

InternalError --- JavaScript 엔진에서 내부 오류가 발생할 때 발생하는 오류를 나타내는 인스턴스를 만듭니다. 예를 들어 "너무 많은 재귀".

RangeError --- 숫자 변수 또는 매개 변수가 유효한 범위를 벗어날 때 발생하는 오류를 나타내는 인스턴스를 만듭니다.

ReferenceError --- 유효하지 않은 참조를 역 참조 할 때 발생하는 오류를 나타내는 인스턴스를 만듭니다.

SyntaxError --- eval ()에서 코드를 구문 분석하는 동안 발생하는 구문 오류를 나타내는 인스턴스를 만듭니다.

TypeError --- 변수 또는 매개 변수가 유효한 유형이 아닐 때 발생하는 오류를 나타내는 인스턴스를 만듭니다.

URIError --- encodeURI () 또는 decodeURI ()에 유효하지 않은 매개 변수가 전달 될 때 발생하는 오류를 나타내는 인스턴스를 만듭니다.


잘못된 인수에 대한보다 일반적인 유형이 누락 된 것 같습니다 . 모든 유효하지 않은 인수가에 해당되는 것은 아닙니다 RangeError. 사용자 정의 유형을 정의해야합니까 throw new Error("<message>");?
anddero

58

JavaScript에서 범위를 벗어난 규칙은을 사용하고 RangeError있습니다. / else + instanceof가 가장 일반적인 것부터 시작 하는 경우 유형 사용을 확인하려면

try {
    throw new RangeError();
}
catch (e){
    if(e instanceof RangeError){
        console.log('out of range');
    }
}

2
일반적인 오류는 어떻습니까? 내장 JS 오류 클래스 목록은 어디에 있습니까?
pitosalas

7
Mozilla Developer Network에는 JavaScript 오류 유형 및 기타 정보의 목록이 있습니다. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Christian Davén

6
@basarat else { throw; }여기에 추가해야한다고 생각합니다
knocte

43

예외별로 메시지를 내보내고 표시하는 간단한 솔루션입니다.

try {
  throw new TypeError("Error message");
}
catch (e){
  console.log((<Error>e).message);//conversion to Error type
}

주의

블록에서 어떤 종류의 오류가 발생할 수 있는지 모른다면 위의 해결책은 아닙니다. 이러한 경우 타입 가드를 사용해야하고 적절한 오류에 대한 적절한 처리를 수행해야합니다. @Moriarty 답변을 살펴보십시오.


명시 적 유형 변환에 대한 포인터에 감사드립니다. Typescript-Docs에서 해당 정보를 찾지 못하고 오늘 무언가를 배웠습니다.
JackLeEmmerdeur 1

<오류>를 추가하는 목적이 무엇인지 아십니까? e. 메시지가 잘 작동합니다.
sbattou

1
@sbattou의 유일한 목적은 <Error>TS 컴파일러에게 (1) 지능적이고 (2) 더 나은 유형 검사를 할 수 있도록 e여기에 유형 <Error>이 있음을 알리는 것입니다. 모든 캐스트는 JS로 전혀 변환되지 않으며 순전히 구문 설탕이라는 점에 유의하십시오.
Didii

24

switch 문을 잊지 마십시오 :

  • 로 취급을 확인하십시오 default.
  • instanceof 수퍼 클래스에서 일치 할 수 있습니다.
  • ES6 constructor는 정확한 수업에 일치합니다.
  • 더 쉽게 읽을 수 있습니다.

function handleError() {
    try {
        throw new RangeError();
    }
    catch (e) {
        switch (e.constructor) {
            case Error:      return console.log('generic');
            case RangeError: return console.log('range');
            default:         return console.log('unknown');
        }
    }
}

handleError();


3
이것은 위대하다. 다른 답변보다 더 강력하고 깨끗해 보입니다.
Victor Zamanian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.