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 :)
Jawaban:
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.
sumber
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
dan jika Anda menggunakan kode seperti yang Anda tulis itu, properti stack tidak akan berubah ketika Anda rethrow kesalahan.
sumber