prosource

자바스크립트에서 예외를 다시 던지면서 스택을 보존하려면 어떻게 해야 합니까?

probook 2023. 9. 15. 21:09
반응형

자바스크립트에서 예외를 다시 던지면서 스택을 보존하려면 어떻게 해야 합니까?

자바스크립트에서 예외가 발생했을 때 정리를 수행하고 싶지만 예외가 스택 위로 계속 전파되도록 한다고 가정합니다.

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

이 코드의 문제는 예외를 잡고 다시 던지면 해당 지점까지의 스택 트레이스 정보가 손실되므로, 나중에 예외가 다시 잡힌 경우, 스택에서 더 높은 곳에서만 스택 트레이스가 다시 내려간다는 것입니다.이것은 실제로 예외를 던진 기능을 포함하지 않는다는 것을 의미하기 때문에 불쾌합니다.

알고 보니..적어도 Chrome에서는 같은 동작을 합니다. (즉, 정확히 문제가 되는 것은 재던지기가 아니라 예외 핸들러 블록이 존재하는 것입니다.)

자바스크립트에서 예외를 다시 던지지만 그와 연관된 스택 트레이스를 보존하는 방법을 아는 사람?이에 실패한다면 예외가 발생했을 때 전체 스택 추적을 캡처하는 동시에 예외 안전 정리 핸들러를 추가할 수 있는 다른 방법에 대한 제안은 어떻습니까?

어떤 조언이든 감사합니다 :)

이것은 크롬의 버그입니다.예외를 다시 던지면 통화 추적이 유지됩니다.

http://code.google.com/p/chromium/issues/detail?id=60240

저는 어떤 해결책도 모릅니다.

저는 결국 문제가 없다고 봅니다.최종적으로 오류 콘솔에 표시되지 않는 경우가 있지만 개발 빌드에서 수정된 예외가 있는 것 같습니다.

Error 개체의 스택 속성은 Error 개체가 던져지는 시점이 아니라 Error 개체 자체와 동시에 생성됩니다.그들은 그 관용구 때문에 종종 똑같습니다.

새 오류를 던집니다("메시지").

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

언급한 바와 같이 스택은 실행 중에 생성된 스냅샷입니다.new Error(...), 같은 스택에서는 오류를 제대로 던질 수 없습니다.

제가 사용했던 해결책은console.error던지기 전 스택:

  console.error(err.stack);
  throw err;

완벽하지는 않지만 디버그 가능한 정보와 원래 오류의 스택을 충분히 얻을 수 있습니다.

처음부터 잡지 말고 마지막으로 사용하세요.

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

언급URL : https://stackoverflow.com/questions/3734236/how-can-i-rethrow-an-exception-in-javascript-but-preserve-the-stack

반응형