"throw new Error"와 "throw some Object"의 차이점은 무엇입니까?
공통 에러 핸들러를 작성해, 코드의 어느 인스턴스에서도 커스텀 에러를 검출하고 싶다.
때throw new Error('sample')
try {
throw new Error({'hehe':'haha'});
// throw new Error('hehe');
} catch(e) {
alert(e);
console.log(e);
}
에 Firefox에 Firefox로 됩니다.Error: [object Object]
그 물체를 해석할 수 없었어요
번째 ★★★★★★★★★★★★★★★★★.throw
에 다음과 같이 됩니다.Error: hehe
반면에 내가 했을 때
try {
throw ({'hehe':'haha'});
} catch(e) {
alert(e);
console.log(e);
}
에는 다음과 같이 됩니다.Object { hehe="haha"}
을 사용하다
뭐가 다른데?
코드와 같은 차이가 있습니까?like 문자열은 문자열로, 객체는 개체로 전달되지만 구문은 다릅니다.
아직 에러 오브젝트 투척에 대해 조사하지 않았습니다.나는 줄 던지기만 했다.
상기 두 가지 방법 외에 다른 방법이 있습니까?
javascript의 'throw new Error'와 'throw some Object'의 차이점은 전달된 오류를 다음과 같은 형식으로 shrow new Error가 랩된다는 것입니다.
{ name: 'Error', 메시지: 'String you pass in constructor' }
throw someObject는 개체를 그대로 던지며 try block에서 더 이상의 코드 실행을 허용하지 않습니다(즉, 새 오류 던지기).
다음은 오류 개체와 오류 발생에 대한 좋은 설명입니다.
에러 오브젝트
에러가 발생했을 때 무엇을 추출할 수 있을까요?모든 브라우저에서 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()).
에러 발생(예외)
제어가 자동으로 시행 블록에서 캐치 블록으로 전송되기 전에 6가지 유형의 오류 중 하나가 발생할 때까지 기다리는 대신 필요에 따라 강제로 발생하도록 명시적으로 예외를 설정할 수도 있습니다.이는 오류의 정의와 제어를 언제 전송하여 포착해야 하는지에 대한 사용자 정의 작성에 유용합니다.
'나는 악마다'를 던지다
throw
에러를 검출하면, 이후의 실행이 종료되어 메시지 문자열이 표시됩니다.
try {
throw "I'm Evil"
console.log("You'll never reach to me", 123465)
} catch (e) {
console.log(e); // I'm Evil
}
연속 투척 콘솔은 종료 원인에 도달하지 않습니다.
새로운 에러("I'm Evil")를 던지다
throw new Error
는 2개의 파라미터 이름과 메시지를 가진 오류 이벤트를 표시합니다.또한 추가 실행을 종료합니다.
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
}
슬로 에러("I'm Evil")
또, 완전성을 위해서도 유효합니다만, 엄밀히 말하면 올바른 방법은 아닙니다.
try {
throw 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
}
console.log(typeof(new Error("hello"))) // object
console.log(typeof(Error)) // function
더선택인지에 좀 더 합니다.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는 단순히 "예외를 포착하지 못함" 오류를 발생시킬 뿐 메시지 문자열을 전혀 제공하지 않습니다.디버깅의 관점에서는 이것이 최적이라고는 할 수 없습니다.
TLDR: 동등 TLDR: 다 t니다다다 t 。Error(x) === new Error(x)
.
// 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 Error
을 사용하다을 잡아서 지지에 할 때.console.log
같은 방법으로 시리얼화되지 않습니다.
throw 'Parameter is not a number!';
throw new Error('Parameter is not a number!');
throw Error('Parameter is not a number!');
Console.log(e)
의 두 다른 수 .
Parameter is not a number!
Error: Parameter is not a number!
Error: Parameter is not a number!
먼저 다음 코드를 언급합니다.
throw new Error('sample')
그리고 첫 번째 예에서는 다음과 같이 씁니다.
throw new Error({'hehe':'haha'})
첫 번째 오류 개체는 문자열 값(이 경우 '샘플')을 예상하기 때문에 실제로 유용합니다.두 번째는 오브젝트를 전달하려고 하고 있고 문자열을 예상하기 때문에 도움이 되는 오류를 표시하지 않기 때문입니다.
오류 개체에는 "message" 속성('sample')이 있습니다.
Error
생성자는 오류 개체를 만드는 데 사용됩니다.오류 개체는 런타임 오류가 발생할 때 느려집니다.Error 개체는 사용자 정의 예외의 기본 개체로도 사용할 수 있습니다.
정의 오류를 .throw
statement.가 첫 프로그램 . 프로그램 제어가 첫 번째에게 넘어갑니다.catch
아, 아, 네.
Error 객체가 있는 경우와 없는 경우의 오류 발생의 차이:
throw {'hehe':'haha'};
Chrome devtools에서는 다음과 같습니다.
Chrome에서 알 수 없는 오류가 발생했다고 합니다.이것은 JS 오브젝트입니다.오브젝트 자체에 에러에 관한 정보가 포함되어 있을 가능성이 있습니다만, 그 출처는 아직 알 수 없습니다.코드를 만들고 디버깅할 때는 그다지 유용하지 않습니다.
throw new Error({'hehe':'haha'});
Chrome devtools에서는 다음과 같습니다.
Error 객체와 함께 느려진 오류는 전개 시 스택트레이스를 표시합니다.이것은, 에러의 정확한 출처를 나타내는 귀중한 정보를 제공합니다.이 정보는 코드를 디버깅할 때 중요한 정보가 되는 경우가 많습니다., 는 「이러다」라고 되어 에 주의해 주세요.[object Object]
는 '이거'가, 「이것」이,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
TLDR
throw new Error('problem')
는, 에러가 발생한 장소의 다수의 속성을 캡쳐주세요.
throw 'problem'
않다
new Error('message')
stack + captures 。
Error 개체를 사용하면 오류를 발생시키는 지점에서 실행 스택을 캡처할 수 있습니다.에러가 에러 처리 트리에 전달되면, 이 스택스냅샷도 에러 처리 트리에 전달됩니다.
★★★★★★★★★★★★★★★★★★★★★★★throw "test error"
코드 베이스의 어딘가에 다음과 같은 결과가 있습니다.
반에 whereas whereas.throw new Error('test error')
을 사용하다
원어민 Error 객체가 스택을 캡처하여 에러를 캡처한 시점에서 사용할 수 있는 것을 알 수 있습니다.그러면 디버깅할 때 문제를 쉽게 추적할 수 있습니다.
게다가 , 및 등의 속성도 캡처합니다.
스택 트레이스를 사용하는 경우 예외 추적기가 대신 기록할 수 있습니다.
이 경우 스택은 브라우저 콘솔에 인쇄되지만 Appsignal이나 Bugsnag와 같은 Javascript 오류 로깅 도구를 사용하는 경우 스택도 사용할 수 있습니다.오류 개체를 검사하면 스택 스냅샷에 직접 액세스할 수 있습니다.
err = new Error('test')
err.stack
사용할 형식을 결정하는 데 사용하는 경험적 접근법
는 '예외'를 사용합니다.new Error('problem')
애플리케이션에서 예기치 않은 문제나 범위를 벗어난 문제가 발생하여 오류를 발생시킨 경우 로컬 데이터스토어가 손상되었다고 가정해 보겠습니다. 처리하지 않으려는 상황이 발생할 수 있지만 플래그를 지정하려고 합니다.이 경우 Error 객체를 사용하여 스택스냅샷을 만듭니다.
「」를 사용해 .throw new Error('Datastore is corrupted')
무슨 일이 일어났는지 추적하는 게 더 쉬워요
일 때 는 가가 when when when when를 사용한다.throw 'problem'
편집 - 다시 읽을 때 다음 부분은 주의가 필요할 것 같습니다.일반적으로 어떤 오류를 잡으려고 선택했는지 매우 구체적으로 확인하는 것이 좋습니다. 그렇지 않으면 실제로 끝까지 버블이 되고 싶었던 것을 잡을 수 있습니다.일반적으로 특정 오류 유형을 생성하여 해당 오류(또는 메시지 문자열)를 파악하는 것이 좋습니다.이렇게 하면 예상치 못한 오류가 표면으로 떠오를 수 있습니다."
에러가 검출되어 처리할 예정의 에러인 경우, 스택스냅샷은 그다지 도움이 되지 않습니다.
http http 500 http http http http http http http http http http http http http http http http http.는 이것을 내가 할 수 .throw "responseCode=500"
이에요.
반응 동작
나머지 답변과는 별도로 React에서 한 가지 차이점을 보여드리고 싶습니다.
가 내 a a a 를 던지면new Error()
개발 모드로 들어가면 에러 화면과 콘솔로그가 표시됩니다.문자열 리터럴을 던지면 콘솔로그를 보고 있지 않으면 콘솔에 표시만 되고 놓칠 수 있습니다.
예
개발 모드일 때 오류 로그를 콘솔에 던지면 오류 화면이 나타납니다(실가동 시에는 화면이 표시되지 않습니다).
throw new Error("The application could not authenticate.");
단, 다음 코드는 콘솔에 로그인만 합니다.
throw "The application could not authenticate.";
이것은 꽤 오래되었지만, 이것을 검색하는 모든 사람이 이것으로부터 배울 수 있기를 바랍니다.
먼저 유명하고 자바스크립트에는 프리미티브 래퍼라고 불리는 것이 있습니다. 프리미티브 래퍼는 원시 데이터를 가져와 단순히 "컨스트럭터 패턴"을 사용하여 객체 형식으로 표현합니다.그러나 프리미티브 래퍼에서는 데이터를 오브젝트 타입으로 반환할지 또는 오브젝트 타입으로 반환할지 결정할 수 있습니다(이 경우 프리미티브 값을 추출하기 위한 javascript에 대한 go-ahead 명령어가 주어지고 이 경우 new 키워드는 사용되지 않습니다).
개요:
"My error" 슬로우: Error 개체를 생성하고 생성자 "this" 개체에서 추출된 원시 데이터를 반환합니다.캐치 블록의 타입을 체크하면, 「문자열」의 원시 타입을 알 수 있습니다.
throw new Error("My error") : 메시지 속성에서 오류 값에 액세스할 수 있는 개체를 반환합니다.여기서 단순히 발생하는 것은 "new 키워드"가 "this" 개체를 구성하고 "{name:"Error", "message:"..."}"를 할당하여 반환하는 것입니다.또한 캐치 블록에서 의 유형을 확인하려고 하면 "객체" 유형이 표시됩니다.
주의: 커스텀오브젝트를 슬로우에 명시적으로 전달한 경우 커스텀오브젝트는 새로운 키워드를 사용하여 컨스트럭터를 호출한 것처럼 동작합니다.따라서 catch 블록은 메시지 속성 값이 아닌 커스텀오브젝트를 반환합니다.예를 들어 {name:"RangeError", 메시지:"range is out of scope", 환경:테스트 기능에서 발생했습니다."}.
결론적으로, 당신이 무엇을 하고 있는지 알고 있는 것을 당신에게 맞는 것을 사용하세요.하지만 저는 데이터가 별로 필요 없고 오류만 있으면 Primitive returner를 선택합니다.
throw something
는 오브젝트와 문자열 모두에서 동작합니다.그러나 다른 방법보다 덜 지원됩니다.throw new Error("")
문자열로만 작동하며 캐치 블록에서 객체를 쓸모없는 [Object obj]로 바꿉니다.
throw new Error()
는 지정된 에러를 발생시키는 경우에 적합합니다., 처리를 처리를 하는 throw { example: 'error' }
.
에러를 는, 「 」, 「 」를 사용합니다.throw new Error("example string")
하려면 , 「」를 throw
.
function makeErrorResponse(err = {}, httpStatus, status, message, message) {
const error = new Error();
error.httpStatus = httpStatus;
error.status = status;
error.message = message;
error.err = err;
return error;
}
throw makeErrorResponse({}, 500, 500, 'server error');
Error
클래스에는 오류가 발생했을 때의 현재 콜스택과 같은 디버깅 정보가 포함됩니다.이 정보는 JS 인터프리터가 유익한 문자열로 시리얼화하는 방법을 알고 있으며 브라우저 개발 도구 등의 소프트웨어를 디버깅하여 오류의 GUI 표현을 구축함으로써 사용할 수 있습니다.그렇기 때문에 일반적으로 더 유용하게 사용할 수 있습니다.Error
예를 들어 에러를 설명하는 문자열이나 에러 코드를 나타내는 숫자를 단순히 던지는 것 이상의 클래스입니다.
사용자 정의 오류 사용
보는 Error
다양한 유형의 오류를 알기 쉬운 이름으로 일의로 식별할 수 있습니다.다음 오류를는 깔끔하고 .instanceof
연산자는 발생한 오류의 종류를 확인합니다. 예:
class ShoesTooBig extends Error {}
class DangerousWaterCurrent extends Error {
constructor(waterSpeed){
super() // Provide no `message` argument to the Error() constructor
this.waterSpeed = waterSpeed // In metres per second. This passes some context about why/how the error occurred back to whichever function is going to catch & handle it.
}
}
// ...later...
try {
swimAcrossRiver(footwear, roilingRiver)
} catch (thrownValue) {
if (thrownValue instanceof DangerousWaterCurrent) {
constructDam(roilingRiver, thrownValue.waterSpeed)
} else {
throw thrownValue // "Re-throw" the error back up the execution chain, for someone else to handle
}
}
new Error()
»Error()
''편리한' 들수.Error
콜 : " " " "Error(message)
「」가 아닌 「」new Error(message)
을 사용하다이것은 언어 설계자가 규칙에 삽입한 의도적인 예외입니다.에도 비슷한 .Number()
★★★★★★★★★★★★★★★★★」String()
, 이러한 는, 로 콜 할 수 ()
마치 수업이 아니라 기능인 것처럼요JS는 일반 클래스가 실제로 "classes"라는 구문설탕 아래에서 기능함수임에도 불구하고 이것을 하는 것을 허용하지 않습니다.REP에서 시도:
> class E extends Error {}
undefined
> Error(); 'a value'
"a value"
> E(); 'a value'
Uncaught TypeError: Class constructor E cannot be invoked without 'new'
at <anonymous>:2:1
개인적으로 이번 결정은 JavaScript 규칙에 예외를 더 많이 추가했기 때문에 실수였다고 생각합니다.C++/Java 대신new
처럼 호출합니다( 「」 「」 「」 「」 「」 「」 등).Number("abc123")
는)의 를 해 둘 필요가 있습니다.constructor
bound " " " 。this
" " 에서 하는 것과 , " " " " " 에서 과 같은 입니다.new
키워드(Python의 구문은 이렇게 작동하며 결과적으로 훨씬 읽기 쉽고 편리해집니다.)
언급URL : https://stackoverflow.com/questions/9156176/what-is-the-difference-between-throw-new-error-and-throw-someobject
'programing' 카테고리의 다른 글
MySQL 및 GROUP_CONCAT() 최대 길이 (0) | 2022.09.24 |
---|---|
클래스 파일에 잘못된 버전 52.0이 있습니다. 50.0이어야 합니다. (0) | 2022.09.24 |
외부 키 제약을 적용하지 않는 mysqldump 파일을 자동으로 만들 수 있습니까? (0) | 2022.09.24 |
AWS SDK for PHP: 인스턴스 프로파일 메타데이터 서버에서 자격 증명을 검색하는 동안 오류가 발생했습니다. (0) | 2022.09.24 |
문자 집합과 대조는 정확히 무엇을 의미합니까? (0) | 2022.09.24 |