2016-08-27 7 views
0

이 질문은 es6 extend를 다루는 Extended Errors do not have message or stack trace과 같지 않지만 es5를 사용하고 있습니다.확장 오류가 스택 추적 정보가 잘못됨

여기에 내 코드

test.js

function FooError(message) { 
    this.stack = (new Error(message)).stack; 
    console.log('this.stack', this.stack); 
    console.log('new_error_stack', (new Error(message)).stack); 
    console.log('after'); 
} 
FooError.prototype = new Error; 

throw new FooError("foo"); 

이 다음과 같은 출력 제공의 : 노드 버전을 당신의 'this.stack'을 볼 수있는 6.4 (node test.js)

this.stack Error 
    at Object.<anonymous> (/tmp/test.js:7:22) 
    at Module._compile (module.js:556:32) 
    at Object.Module._extensions..js (module.js:565:10) 
    at Module.load (module.js:473:32) 
    at tryModuleLoad (module.js:432:12) 
    at Function.Module._load (module.js:424:3) 
    at Module.runMain (module.js:590:10) 
    at run (bootstrap_node.js:394:7) 
    at startup (bootstrap_node.js:149:9) 
    at bootstrap_node.js:509:3 
new_error_stack Error: foo 
    at Error.FooError (/tmp/test.js:4:33) 
    at Object.<anonymous> (/tmp/test.js:9:7) 
    at Module._compile (module.js:556:32) 
    at Object.Module._extensions..js (module.js:565:10) 
    at Module.load (module.js:473:32) 
    at tryModuleLoad (module.js:432:12) 
    at Function.Module._load (module.js:424:3) 
    at Module.runMain (module.js:590:10) 
    at run (bootstrap_node.js:394:7) 
    at startup (bootstrap_node.js:149:9) 
after 

/tmp/test.js:9 
throw new FooError("foo"); 
^ 
Error 
    at Object.<anonymous> (/tmp/test.js:7:22) 
    at Module._compile (module.js:556:32) 
    at Object.Module._extensions..js (module.js:565:10) 
    at Module.load (module.js:473:32) 
    at tryModuleLoad (module.js:432:12) 
    at Function.Module._load (module.js:424:3) 
    at Module.runMain (module.js:590:10) 
    at run (bootstrap_node.js:394:7) 
    at startup (bootstrap_node.js:149:9) 
    at bootstrap_node.js:509:3 

'new_error_stack'보다 똑같은 것을 보여주지는 않습니다. 예를 들어, this.stack은 require가 호출되었을 때 에러가 던져진 것처럼 스택을 보여줍니다. 또한 던져진 스택은 "잘못되었습니다".

https://stackoverflow.com/a/5251506/1993501에서 코드를 가져 왔고 instanceof FooError을 사용하고 싶으므로 FooError.prototype = new Error 줄을 사용합니다.

'new_error_stack'은 예상되는 결과를 제공하지만 두 값이 같을 것으로 예상됩니다. https://github.com/open-xml-templating/docxtemplater/issues/245

정확히 무슨 일이 일어나고 무엇

, 나는 적절한 오류 유형을 방지하고 유지할 수있는 방법 (예 : 수있는 :

이 오류 내 라이브러리의 사용자에게 매우 유용하지 않은 효과를 가지고, 해당 문제를보고 instanceof 사용)?

+0

괄호를 사용하여이 줄의 Error 개체 선언을 둘러싸고 있지 않은 이유가 있습니까? 'new Error (message) .stack'? 그것은 그것이 다음과 같이 이상하지 않은 것처럼 나를 놀라게합니다. : (새로운 오류 (메시지)). stack', [이 링크]에있는 것처럼 (http://stackoverflow.com/questions/1382107/whats-a-good- 편도 - 확장 오류 -에서 자바 스크립트/5251506 # 5251506). – Xetnus

+0

의도적 인 것은 아니지만 영향력이없는 것으로 보입니다. 두 구문이 동일하다고 생각합니다. 코드가 다를 수 없도록 여전히 내 게시물을 편집했습니다. – edi9999

답변

1

문제점에 대한 가능한 해결책을 찾았지만 문제가 모두 해결되었다고 완전히 확신 할 수는 없습니다. 나는 new Error 대신에 Error.prototype을 사용하고 있습니다. 나는 또한 내가 테스트 목적으로 출력을 표시 할 alert()를 사용하여되면서 두 개의 문자열을 연결하기 위해 console.log 라인을 변경 How do I create a custom Error in JavaScript?

:이 질문에 제공되는 첫 번째 대답에서이 솔루션을 발견했다.

케빈 하칸 손 (Kevin Hakanson)은 왜이 해결책을 제시 할 것인지 묻는 것입니다. 질문에 대한 답변 코드는 다음과 같습니다.

function FooError(message) { 
    this.stack = (new Error(message)).stack; 
    console.log('this.stack ' + this.stack); 
    console.log('new_error_stack ' + (new Error(message)).stack); 
    console.log('after'); 
} 

FooError.prototype = Error.prototype; 

throw new FooError("foo"); 

마지막 줄과 함께 try/catch 블록을 사용할 수 있습니다.

+0

좋아,이 작동하는 것, 감사합니다. 다르게 행동하는 이유를 알고 있습니까? – edi9999

+0

나는 말할 수 없다. 다르게 행동하는 것은 꽤 이상합니다. 그러나'Error.prototype'을 사용하여 문제가 발생하면, 제가 준 링크에서 두 번째 대답을 확인하십시오. – Xetnus