[javascript] `throw new Error`와`throw someObject`의 차이점은 무엇입니까?

코드의 모든 인스턴스에서 의도적으로 발생하는 사용자 정의 오류를 포착하는 일반적인 오류 처리기를 작성하고 싶습니다.

throw new Error('sample')다음 코드에서 좋아했을 때

try {
    throw new Error({'hehe':'haha'});
    // throw new Error('hehe');
} catch(e) {
    alert(e);
    console.log(e);
}

로그가 Firefox에 표시되고 Error: [object Object]객체를 구문 분석 할 수 없습니다.

두 번째 throw로 로그는 다음과 같이 표시됩니다.Error: hehe

내가했을 때

try {
    throw ({'hehe':'haha'});
} catch(e) {
    alert(e);
    console.log(e);
}

콘솔은 Object { hehe="haha"}오류 속성에 액세스 할 수있는 것으로 표시되었습니다 .

차이점은 무엇입니까?

코드에서 볼 수 있듯이 차이점이 있습니까? like string은 객체로 문자열 및 객체로 전달되지만 구문은 다릅니 까?

나는 오류 객체 던지기를 탐구하지 않았다 … 나는 문자열 던지기 만했다.

위에서 언급 한 두 가지 방법 이외의 다른 방법이 있습니까?



답변

다음은 Error 객체 에 대한 좋은 설명 과 자신의 오류 발생

오류 객체

오류가 발생했을 때 무엇을 추출 할 수 있습니까? 모든 브라우저에서 Error 객체는 다음 두 가지 속성을 지원합니다.

  • name : 오류의 이름, 즉 오류가 속하는 생성자 함수의 이름입니다.

  • 메시지 : 오류에 대한 설명이며이 설명은 브라우저에 따라 다릅니다.

언급 된 것처럼 오류의 생성자 이름에 해당하는 name 속성으로 6 가지 가능한 값을 반환 할 수 있습니다. 그들은:

Error Name          Description

EvalError           An error in the eval() function has occurred.

RangeError          Out of range number value has occurred.

ReferenceError      An illegal reference has occurred.

SyntaxError         A syntax error within code inside the eval() function has occurred.
                    All other syntax errors are not caught by try/catch/finally, and will
                    trigger the default browser error message associated with the error.
                    To catch actual syntax errors, you may use the onerror event.

TypeError           An error in the expected variable type has occurred.

URIError            An error when encoding or decoding the URI has occurred
                   (ie: when calling encodeURI()).

자신의 실수를 던지기 (예외)

제어가 try 블록에서 catch 블록으로 자동 전송되기 전에 6 가지 유형의 오류 중 하나가 발생할 때까지 기다리지 않고 필요에 따라 발생하도록 강제로 자신의 예외를 명시 적으로 던질 수도 있습니다. 이는 오류가 무엇인지, 언제 제어를 전달해야하는지에 대한 고유 한 정의를 작성하는 데 유용합니다.


답변

“나는 악하다”

throw오류 를 발견 하면 추가 실행 을 종료 하고 메시지 문자열을 노출합니다 .

try {
  throw "I'm Evil"
  console.log("You'll never reach to me", 123465)
} catch (e) {
  console.log(e); //I'm Evil
}

투척 후 콘솔 은 종료 원인에 도달하지 않습니다.


새로운 오류를 던져 ( “나는 너무 달콤 해”)

throw new Error두 개의 params name & message 오류 메시지를 표시 합니다. 또한 추가 실행을 종료합니다

try {
  throw new Error("I'm Evil")
  console.log("You'll never reach to me", 123465)
} catch (e) {
  console.log(e.name, e.message); //Error, I'm Evil
}


답변

다음 기사는 어느 쪽이 더 나은 선택인지에 대해 좀 더 자세하게 다룰 것입니다. throw 'An error'또는 throw new Error('An error'):

http://www.nczonline.net/blog/2009/03/10/the-art-of-throwing-javascript-errors-part-2/

new Error()Internet Explorer 및 Safari (버전에 대해 잘 모름)와 같은 브라우저는 전자를 사용할 때 메시지를 올바르게보고하지 않기 때문에 후자 ( )가 더 안정적 임을 나타냅니다 .

그렇게하면 오류가 발생하지만 모든 브라우저가 예상 한대로 응답하지는 않습니다. Firefox, Opera 및 Chrome은 각각 “미 발견 예외”메시지를 표시 한 다음 메시지 문자열을 포함합니다. Safari와 Internet Explorer는 단순히 “미 발견 예외”오류를 발생시키고 메시지 문자열을 전혀 제공하지 않습니다. 분명히 이것은 디버깅 관점에서 차선책입니다.


답변

먼저이 코드를 언급하십시오.

throw new Error('sample')

그리고 첫 번째 예에서 다음과 같이 씁니다.

throw new Error({'hehe':'haha'}) 

첫 번째 Error 객체는 실제로는 문자열 값을 예상하기 때문에 작동합니다 (이 경우 ‘sample’). 두 번째는 객체를 전달하려고 시도하지 않았으며 문자열을 기대하고 있기 때문입니다.

오류 객체에는 “message”속성이 있으며 ‘sample’입니다.


답변

TLDR : 동일합니다.

// this:
const x = Error('I was created using a function call!');
​​​​// has the same functionality as this:
const y = new Error('I was constructed via the "new" keyword!');

출처 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error


답변

당신은 throw객체로 할 수 있습니다

throw ({message: 'This Failed'})

예를 들어 try/catch

try {
//
} catch(e) {
    console.log(e); //{message: 'This Failed'}
    console.log(e.message); //This Failed
}

또는 그냥 문자열 오류를 던져

throw ('Your error')

try {
//
} catch(e) {
    console.log(e); //Your error
}

throw new Error //only accept a string


답변

Error생성자는 오류 객체를 생성하는 데 사용됩니다. 런타임 오류가 발생하면 오류 개체가 발생합니다. Error 객체는 사용자 정의 예외의 기본 객체로 사용될 수도 있습니다.

throw명령문을 통해 사용자 정의 오류가 발생 합니다. 프로그램 제어는 catch호출 스택 의 첫 번째 블록 으로 전달됩니다 .

Error 객체 유무에 관계없이 오류를 던지는 것의 차이점 :


throw {'hehe':'haha'};

크롬에서 devtools는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

Chrome은 JS 객체 인 잡히지 않은 오류가 있다고 알려줍니다. 객체 자체는 오류에 관한 정보를 가질 수 있지만 여전히 어디서 왔는지 즉시 알 수 없습니다. 코드 작업을하고 디버깅 할 때는 그다지 유용하지 않습니다.


throw new Error({'hehe':'haha'}); 

크롬에서 devtools는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

Error 객체와 함께 발생한 오류는 확장 할 때 스택 추적을 제공합니다. 이를 통해 오류를 정확하게 발생시키는 유용한 정보를 얻을 수 있으며, 이는 코드 디버깅시 유용한 정보입니다. 또한 오류는 [object Object], Error생성자가 메시지 문자열을 첫 번째 인수로 기대 하기 때문 입니다. 객체를 받으면 문자열로 강제 변환합니다.