2010-09-17 31 views
100

Trong javascript, giả sử tôi muốn thực hiện một số ngẫu nhiên khi một ngoại lệ xảy ra, nhưng chúng ta hãy ngoại trừ tiếp tục tuyên truyền lên stack, ví dụ:Làm cách nào để tôi có thể trả lại ngoại lệ trong Javascript, nhưng vẫn giữ nguyên ngăn xếp?

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

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

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

Có ai biết cách để tính lại ngoại lệ trong Javascript nhưng vẫn giữ nguyên dấu vết ngăn xếp được liên kết với nó không? Không có điều đó, làm thế nào về các đề xuất cho các cách khác để thêm bộ xử lý dọn dẹp ngoại lệ an toàn, trong khi cũng chụp dấu vết ngăn xếp hoàn thành khi một ngoại lệ xảy ra?

Thanks cho bất kỳ gợi ý :)

+7

0x3a28213a - mong được cảm ơn của tôi ;-) – bacar

+0

Đợi: https://stackoverflow.com/questions/5249960/javascript-rethrowing-an-exception-preserving-the-stack-trace – MatthewMartin

+0

Câu hỏi này nên được đóng vì nó đề cập đến một lỗi Chrome được sửa vào năm 2012. –

Trả lời

53

Đây là lỗi trong Chrome. Rethrowing một ngoại lệ nên bảo vệ dấu vết cuộc gọi.

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

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

Tôi không thấy vấn đề với cuối cùng. Tôi thấy các 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 khi cuối cùng, nhưng điều đó dường như được sửa trong các bản xây dựng phát triển.

+13

Lỗi này dường như đã được khắc phục ngay bây giờ. – mzedeler

15

Thuộc tính chồng của một đối tượng Lỗi được tạo ra tại cùng một thời điểm với đối tượng Lỗi bản thân, chứ không phải tại thời điểm nó được ném. Họ thường là người cùng vì thành ngữ

 
    throw new Error("message"); 

và nếu bạn sử dụng mã cũng giống như bạn đã viết nó, ngăn xếp bất động sản sẽ không được thay đổi khi bạn rethrow lỗi.

+1

Đ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 stack trên tuyên bố ném, mất ngăn xếp ban đầu. –

+0

Có lẽ như 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? –

Các vấn đề liên quan