Javascript에서 예외를 다시 발생 시키지만 스택을 보존하려면 어떻게해야합니까?


151

Javascript에서 예외가 발생할 때 정리를 수행하려고하지만 예외가 스택을 계속 전파하도록하십시오.

try {
  enterAwesomeMode();
  doRiskyStuff(); // might throw an exception
} catch (e) {
  leaveAwesomeMode();
  throw e;
}
doMoreStuff();
leaveAwesomeMode();

이 코드의 문제점은 예외를 잡아서 다시 던지면 스택 추적 정보가 해당 지점까지 손실되므로 예외가 다시 발견되면 스택에서 상위로 올라가면 스택 추적 만 다시 추적됩니다. -던지다. 실제로 예외를 던진 함수가 포함되어 있지 않기 때문에 짜증납니다.

결과적으로 try..finally는 적어도 Chrome에서 동일한 동작을 갖습니다 (즉, 정확하게 다시 던지는 것이 아니라 예외 처리기 블록이 있다는 것입니다).

누구나 Javascript에서 예외를 다시 던지지 만 이와 관련된 스택 추적을 유지하는 방법을 알고 있습니까? 실패하면 예외 안전 정리 처리기를 추가하고 예외가 발생할 때 완전한 스택 추적을 캡처하는 다른 방법에 대한 제안은 어떻습니까?

모든 포인터 주셔서 감사합니다 :)


답변:



24

Error 객체의 stack 속성은 발생한 시점이 아니라 Error 객체 자체와 동시에 생성됩니다. 관용구 때문에 종종 동일합니다

   새로운 오류를 던지십시오 ( "message");

코드를 작성한 그대로 사용 하면 오류를 다시 발생시킬 때 스택 속성이 변경 되지 않습니다 .


5
이것은 사실이 아닙니다 (플랫폼에 따라 다름). 지금 사용하는 js 엔진 (Rhino)은 throw 문에서 스택을 재설정하여 원래 스택을 잃습니다.
Ted Bigham

1
아마도 그렇게 되겠지만 rhino-1.7.7.2.jar는 그것을 바꾸지 않습니다. 어떤 버전을 사용하고 있습니까?
Mike Stay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.