2011-03-13 5 views
1

일반적인 질문,하지만 문제의 코드는 다음과 같습니다 : -javascript에서 호출 스택을 동적으로 볼 수있는 방법이 있습니까?

MyObj.prototype.err = function(msg) { ... throw(msg); } 

그렇게 던져,

if(mybad) this.err('my message'); 

싶습니다

가 발생합니다 오류 루틴을 가지고는 예외 사항을 처리합니다 err()은 함수가 호출 스택에 있는지 여부에 따라 다르게 동작합니다. funcA 상류 인 경우, 사용자에게 경고 및 정지 싶습니다

funcA() -> func2() -> func3() -> err() 

funcB() -> func3() -> err() 

예를 들어, 수 있었다; 반면에 funcB라면, 콘솔에 메시지를 쓰고 계속하고 싶습니다. 내가

var err = function(msg) { 
    // ... 
    var error = new Error(); 
    var stack = error.stack; 
    // Do some string manipulation with stack 
    // mayThrow = 'funcB is in stack' 
    if (mayThrow) { 
    throw(msg); 
    } 
}; 

수 :

은 크롬에서

+0

+1 "경험할 수있는 상태 공간을 생성 (유지)하는 불운" –

+0

[Here] (http://eriwen.com/javascript/stacktrace-update/)는 흥미로운 블로그 게시물입니다. 그러나, 나는 당신의 마지막 문장에 동의하기 때문에, 이것은 "불운"접근법처럼 보이고, 확실히 느릴 것입니다. – Pointy

답변

0

당신이 할 수있는 환경에서 추론 할 수있는 상태 공간을 생성 (그리고 유지)하는 문제를 해결하는 다른 방법,하지만 이럴 불운을 실현 내가 이것을 이라고 생각하는 것은 매우 나쁜 습관이다.. 나는 FuncB에서 오류를 잡아 내야한다고 생각하는데, err에서 던지지 않는 함수로 FuncB을 정의하는 대신에. 코드가 적고 관리가 훨씬 쉽습니다. 그래서이 더 나은 솔루션 이유

var err = function(msg) { 
    // ... 
    throw(msg); 
}; 

var func3 = function() { 
    // ... 
    err('Double rainbow'); 
}; 

var funcB = function() { 
    try { 
    func3(); 
    catch(e) { 
    console.log(e); 
    } 
}; 

시도가 이해하기 위해서는하는 기능을하는 기능에 속하는 책임을 정의에 관한 것입니다. 이것은 예외 및 처리가 그대로 설계된 이유입니다.

0

당신이 해결하려고하는 것이 확실하지 않지만, 이것보다 더 좋은 방법이 있다고 확신합니다. 이 같은

var callstack = []; 

function traced(name, func) { 
    return function() { 
    callstack.push(name); 
    func.apply(this, arguments); 
    callstack.pop(); 
    } 
} 

및 사용 :

var a = traced("a", function() { 
    b(); 
}); 

var b = traced("b", function() { 
    c(); 
}); 

var c = traced("c", function() { 
    var s = callstack.join("<br>"); 
    document.getElementById('output').innerHTML = s; 
}); 

document.getElementById('a').onclick = a; 
document.getElementById('b').onclick = b; 

당신 말했다되고 그건

, 여기에 기능을 추적 및 브라우저 별 스택 추적의 분석에 의존하지 않고 호출 스택을 확인하는 하나의 방법입니다 여기에 바이올린으로 확인할 수 있습니다 : http://jsfiddle.net/AsrSp/

관련 문제