Bagaimana saya bisa mengubah kembali pengecualian dalam Javascript, tetapi menyimpan stack?

151

Dalam Javascript, misalkan saya ingin melakukan pembersihan ketika pengecualian terjadi, tetapi biarkan pengecualian terus menyebarkan tumpukan, misalnya:

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

Masalah dengan kode ini adalah bahwa menangkap dan memikirkan kembali pengecualian menyebabkan informasi jejak tumpukan hingga titik tersebut hilang, sehingga jika pengecualian tersebut kemudian ditangkap lagi, lebih tinggi di tumpukan, jejak tumpukan hanya turun ke bagian -melemparkan. Ini menyebalkan karena itu berarti tidak mengandung fungsi yang sebenarnya melempar pengecualian.

Ternyata, coba .. akhirnya memiliki perilaku yang sama, setidaknya di Chrome (yaitu, bukan lemparan ulang yang merupakan masalah tepatnya, tetapi keberadaan blok handler pengecualian sama sekali.)

Adakah yang tahu cara untuk melakukan rethrow eksepsi dalam Javascript tetapi menyimpan jejak stack yang terkait dengannya? Gagal itu, bagaimana dengan saran untuk cara lain untuk menambahkan penangan pembersihan pengecualian-aman, sementara juga menangkap jejak tumpukan lengkap ketika pengecualian terjadi?

Terima kasih atas petunjuknya :)

Geoff
sumber

Jawaban:

78

Ini adalah bug di Chrome. Memikirkan kembali pengecualian harus mempertahankan jejak panggilan.

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

Saya tidak tahu solusinya.

Saya tidak melihat masalah dengan akhirnya. Saya memang melihat pengecualian diam-diam tidak muncul di konsol kesalahan dalam beberapa kasus setelah akhirnya, tetapi yang tampaknya diperbaiki dalam pembangunan membangun.

Glenn Maynard
sumber
5
Masalah ini telah ditutup.
Zachary Burns
24

Properti stack dari objek Error dibuat pada saat yang sama dengan objek Error itu sendiri, bukan pada titik itu dilemparkan. Mereka sering sama karena idiom

   throw new Error ("message");

dan jika Anda menggunakan kode seperti yang Anda tulis itu, properti stack tidak akan berubah ketika Anda rethrow kesalahan.

Mike Stay
sumber
5
Ini tidak benar (mungkin platform tergantung). Mesin js yang saya gunakan sekarang (Badak) me-reset stack pada pernyataan throw, kehilangan stack asli.
Ted Bigham
1
Mungkin begitu, tetapi badak-1.7.7.2.jar tidak mengubahnya. Versi apa yang Anda gunakan?
Mike Stay