Làm cách nào tôi có thể lấy lại một ngoại lệ trong Javascript, nhưng bảo toàn ngăn xếp?


151

Trong Javascript, giả sử tôi muốn thực hiện một số dọn dẹp khi có ngoại lệ xảy ra, nhưng hãy để ngoại lệ tiếp tục truyền bá ngăn xếp, ví dụ:

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

Vấn đề với mã này là việc bắt và lấy lại ngoại lệ làm cho thông tin theo dõi ngăn xếp bị mất đến điểm đó, do đó, nếu ngoại lệ sau đó bị bắt lại, cao hơn trên ngăn xếp, dấu vết ngăn xếp chỉ đi xuống lại -phi. Điều này thật tệ bởi vì nó có nghĩa là nó không chứa hàm thực sự đã ném ngoại lệ.

Hóa ra, hãy thử..tất cả đều có hành vi tương tự, trong ít nhất là Chrome (nghĩa là, đó không phải là vấn đề chính xác, mà là sự hiện diện của bất kỳ khối xử lý ngoại lệ nào).

Có ai biết cách để lấy lại một ngoại lệ trong Javascript nhưng lưu giữ dấu vết ngăn xếp liên quan đến nó không? Không, làm thế nào về các đề xuất cho các cách khác để thêm trình xử lý dọn dẹp ngoại lệ, đồng thời ghi lại các dấu vết ngăn xếp hoàn chỉnh khi có ngoại lệ xảy ra?

Cảm ơn cho bất kỳ con trỏ :)


Câu trả lời:


78

Đây là một lỗi trong Chrome. Lấy lại một ngoại lệ sẽ giữ nguyên dấu vết cuộc gọi.

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

Tôi không biết cách giải quyết nào.

Tôi không thấy vấn đề cuối cùng. Tôi thấy các trường hợp ngoại lệ âm thầm không hiển thị trên bảng điều khiển lỗi trong một số trường hợp sau một lần cuối cùng, nhưng điều đó dường như đã được sửa trong các bản dựng phát triển.


4
Vấn đề này đã được đóng lại.
Zachary bị bỏng

24

Thuộc tính ngăn xếp của một đối tượng Lỗi được tạo cùng lúc với chính đối tượng Lỗi, chứ không phải tại điểm mà nó ném. Chúng thường giống nhau vì thành ngữ

   ném lỗi mới ("tin nhắn");

và nếu bạn sử dụng mã giống như bạn đã viết, thuộc tính ngăn xếp sẽ không bị thay đổi khi bạn sửa lại lỗi.


5
Điều này không đúng (có thể phụ thuộc vào nền tảng). Công cụ js tôi đang sử dụng bây giờ (Rhino) đặt lại ngăn xếp trên câu lệnh ném, làm mất ngăn xếp ban đầu.
Ted Bigham

1
Có lẽ vì vậy, nhưng rhino-1.7.7.2.jar không thay đổi nó. Phiên bản nào bạn đang sử dụng?
Mike Ở lại
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.