ฉันจะสร้างข้อยกเว้นใหม่ใน Javascript ได้อย่างไร แต่เก็บสแต็คไว้?


151

ใน Javascript สมมติว่าฉันต้องการดำเนินการล้างข้อมูลเมื่อเกิดข้อยกเว้น แต่ให้ข้อยกเว้นดำเนินการต่อไปเพื่อกระจายสแต็กเช่น:

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

ปัญหาของรหัสนี้คือการจับและ rethrowing ข้อยกเว้นทำให้ข้อมูลการติดตามสแต็กถึงจุดนั้นหายไปดังนั้นหากข้อผิดพลาดถูกดักจับในภายหลังอีกครั้งสูงขึ้นบนสแต็กการติดตามสแต็กจะลงไปที่ -โยน. สิ่งนี้แย่เพราะมันหมายความว่ามันไม่มีฟังก์ชั่นที่ทำให้เกิดข้อยกเว้น

ตามที่ปรากฎลอง .. ในที่สุดก็มีพฤติกรรมเหมือนกันใน Chrome อย่างน้อย (นั่นคือไม่ใช่การโยนซ้ำที่เป็นปัญหาอย่างแม่นยำ แต่มีตัวจัดการบล็อกข้อยกเว้นอยู่เลย)

ไม่มีใครรู้วิธีที่จะ rethrow ข้อยกเว้นใน Javascript แต่รักษาร่องรอยสแต็คที่เกี่ยวข้องกับมันได้หรือไม่ ความล้มเหลวนั้นวิธีการเกี่ยวกับคำแนะนำสำหรับวิธีอื่น ๆ ในการเพิ่มตัวจัดการการล้างข้อมูลบนข้อยกเว้นที่ปลอดภัยขณะเดียวกันก็จับการติดตามสแต็กที่สมบูรณ์เมื่อมีข้อยกเว้นเกิดขึ้น

ขอบคุณสำหรับคำแนะนำใด ๆ :)


คำตอบ:


78

นี่เป็นข้อบกพร่องใน Chrome การ Rethrowing ข้อยกเว้นควรเก็บการติดตามการโทรไว้

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

ฉันไม่รู้วิธีแก้ปัญหาใด ๆ

ในที่สุดฉันไม่เห็นปัญหา ฉันเห็นข้อยกเว้นที่เงียบ ๆ ไม่ปรากฏขึ้นบนคอนโซลข้อผิดพลาดในบางกรณีหลังจากในที่สุด แต่ดูเหมือนว่าจะได้รับการแก้ไขในการพัฒนาสร้าง


5
ปัญหานี้ได้ถูกปิดไป
Zachary Burns

24

คุณสมบัติสแต็กของวัตถุข้อผิดพลาดถูกสร้างขึ้นในเวลาเดียวกันกับวัตถุข้อผิดพลาดตัวเองไม่ได้อยู่ในจุดที่มันถูกโยน พวกมันมักจะเหมือนกันเพราะสำนวน

   โยนข้อผิดพลาดใหม่ ("ข้อความ");

และถ้าคุณใช้รหัสเช่นเดียวกับที่คุณเขียนมันคุณสมบัติกองซ้อนจะไม่เปลี่ยนเมื่อคุณสร้างข้อผิดพลาดขึ้นมาใหม่


5
สิ่งนี้ไม่เป็นความจริง (อาจขึ้นอยู่กับแพลตฟอร์ม) เอ็นจิ้น js ที่ฉันใช้อยู่ในขณะนี้ (แรด) รีเซ็ตสแต็กตามคำสั่ง throw ทำให้สูญเสียสแต็กดั้งเดิม
Ted Bigham

1
อาจเป็นเช่นนั้น แต่ rhino-1.7.7.2.jar จะไม่เปลี่ยนแปลง คุณใช้เวอร์ชั่นอะไร
ไมค์อยู่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.