Як я можу повторно скинути виняток у Javascript, але зберегти стек?


151

У Javascript, припустимо, я хочу виконати деяку очистку, коли трапляється виняток, але нехай виняток продовжує розповсюджувати стек, наприклад:

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

Проблема цього коду полягає в тому, що захоплення та повторне скидання винятку призводить до втрати інформації про сліди стека до цього моменту, так що якщо виняток згодом знову потрапляє вище, вище в стеку, слід стека знижується лише до -кинути. Це смокче, оскільки це означає, що він не містить функції, яка насправді викинула виняток.

Як виявляється, спробуйте .. остаточно має таку саму поведінку, принаймні, у Chrome (тобто проблема не в тому, що саме перекидання, а в тому, що взагалі існує будь-який блок обробника винятків.)

Хтось знає про спосіб повторного скидання виключення у Javascript, але зберегти пов'язаний з ним слід стека? Якщо цього не зробити, як щодо пропозицій щодо інших способів додати безпечні для винятків оброблювачі очищення, а також фіксуючи повні сліди стека, коли відбувається виняток?

Дякую за будь-які покажчики :)


Відповіді:


78

Це помилка в Chrome. Повторне виключення повинно зберігати слід виклику.

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

Я не знаю жодного рішення.

Нарешті, я не бачу проблеми. Я бачу винятки, які мовчки не відображаються на консолі помилок у деяких випадках після остаточного, але це, здається, виправлене в розробках розробок.


5
Це питання закрито.
Захарій Бернс

24

Властивість стека об'єкта Error створюється одночасно з самим об'єктом Error, а не в точці, яку він кидає. Вони часто однакові через ідіому

   кинути нову помилку ("повідомлення");

і якщо ви використовуєте код так само, як ви його написали, властивість стека не буде змінено, коли ви повторно скинете помилку.


5
Це неправда (можливо, залежно від платформи). Двигун js, який я зараз використовую (Rhino), скидає стек у операторі кидків, втрачаючи початковий стек.
Тед Бігхем

1
Можливо, так, але носоріг-1.7.7.2.jar це не змінює. Яку версію ви використовуєте?
Майк перебувати
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.