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


378

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

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은 객체로 문자열 및 객체로 전달되지만 구문은 다릅니 까?

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

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


6
throw new Error ({prop : val})의 문제는 유효한 Error 구성이 아니라는 것입니다. 오류는 Hemant가 논의한 특성을 알고 있습니다.
grantwparks

답변:


216

다음은 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 가지 유형의 오류 중 하나가 발생할 때까지 기다리지 않고 필요에 따라 발생하도록 강제로 자신의 예외를 명시 적으로 던질 수도 있습니다. 이는 오류가 무엇인지, 언제 제어를 전달해야하는지에 대한 고유 한 정의를 작성하는 데 유용합니다.


4
아, 네. 이것은이 질문을하기 전에 내가 놓친 좋은 물건입니다. 어쨌든 이와 관련된 정보를 검색하는 사용자가 지워집니다. 이제 나는 무엇이 무엇인지 분명합니다. :) 감사합니다. 나는 며칠 안에 다시 투표 할 것입니다.
Jayapal Chandran

184
질문에 아직 답하지 않은 답변은 없습니까?
user9993

@ user9993 사용자 질문은 당시 채팅에 대한 자세한 이해를 찾고 있었으므로 이에 대한 답변이 제공되어 사용자에게 유용했습니다. 그것이 가장 많은 표를 얻은 이유입니다.
Hemant Metalia 2016 년

5
@HemantMetalia 그러나 그는 옳습니다. 답변은 명시된 바와 같이 OP 질문에 대답하기위한 최소한의 시도조차 보여주지 않습니다. 채팅 상태를 유지해야하는 채팅에서 매우 다른 답변이 응답 된 경우 여기에서 질문과 답변은 논리적으로 연결되지 않습니다.
Mörre

그리고 원래 질문에 대답하기 위해 Javascript에는 중요하지 않습니다. 그러나 Error(및 서브 클래스)는 규칙에 따라 사용됩니다. 또한 수동으로 다른 속성을 추가 할 수 있지만 기본적으로 스택 속성을 제공합니다. 그래서 그것은 실제로 대부분 관습입니다. 프로그램 흐름은 던지는 것에 영향을받지 않으며 단지 당신 throw이 중요합니다. 당신은 할 수 throw "grandmother down the stairs";있으며, 동일하게 작동 연결된 스택 추적 및 오류 처리 기능, 기자, 디버거는 기대가되지 않습니다 것을 제외 것 Error, 또는 좀 더 정확히 말하면, 함께 제공되는 속성을.
Mörre

104

"나는 악하다"

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
}


16
"throw Error ( 'whatever')"와 "throw new Error ( 'whatever')"의 차이점은 무엇입니까?
joedotnot

9
오류는 작동하고 새로운 오류는 생성자입니다. 둘 다 동일한 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…를
Nishchit Dhanani

5
@NishchitDhanani 나는 그처럼 말할 수없는 잘못된 의견이 공언을 얻는 것이 이상하다고 생각합니다. "오류는 기능적"이거나 "새로운 오류는 생성자"둘 다 전혀 의미가 없으며 잘못되었습니다. 이러한 맥락에서 링크가 정확히 "증명"해야하는 것이 확실하지 않습니다. 에 대한 MDN 페이지입니다 Error. 댓글과의 연결은 어디에 있습니까? OP에 대해 의견을 말하고 답변하는 사람들의 절반은 침묵을 유지해야했습니다.
Mörre

Mörre 참조 @이 부분 Used as a function이 링크를 ...에서 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Nishchit Dhanani

알았어 그것은이다 기능 .
Nishchit Dhanani

73

다음 기사는 어느 쪽이 더 나은 선택인지에 대해 좀 더 자세하게 다룰 것입니다. 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는 단순히 "미 발견 예외"오류를 발생시키고 메시지 문자열을 전혀 제공하지 않습니다. 분명히 이것은 디버깅 관점에서 차선책입니다.


36

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

throw new Error('sample')

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

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

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

오류 객체에는 "message"속성이 있으며 'sample'입니다.


12
두 번째는 매우 유용한 방식으로 작동하지 않습니다. toString()전달 된 객체 에서 메소드를 실행하여 [object Object]Op가 쓴대로 오류가 발생합니다.
cjn


15

당신은 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

15

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

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

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


throw {'hehe':'haha'};

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

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

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


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

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

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

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


2

반응 행동

나머지 답변 외에도 React에서 한 가지 차이점을 보여주고 싶습니다.

를 던지고 new Error()개발 모드에 있으면 오류 화면과 콘솔 로그가 표시됩니다. 문자열 리터럴을 던지면 콘솔 로그를 보지 않으면 콘솔에서만 볼 수 있으며 누락 될 수 있습니다.

콘솔에 오류 로그를 던지는 개발 단계 모드에서 프로그램 오류 화면 (스크린 생산에 표시되지 않습니다).

throw new Error("The application could not authenticate.");

반응 오류 화면

다음 코드는 콘솔에만 로그인합니다.

throw "The application could not authenticate.";
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.