2011-08-17 27 views
42

Javascript có hàm gọi lại tuyệt vời này window.onerror. Nó khá thuận tiện để theo dõi bất kỳ lỗi nào. Tuy nhiên, nó gọi với tên lỗi, tên tệp và dòng. Nó chắc chắn không phải là phong phú như nhận được các đối tượng lỗi thực tế từ một tuyên bố try...catch. Đối tượng lỗi thực tế chứa nhiều dữ liệu hơn, vì vậy tôi đang cố gắng để có được điều đó. Thật không may, tuyên bố try...catch không hoạt động tốt khi bạn bắt đầu có mã async.Nhận đối tượng Lỗi Javascript thực tế với window.onerror

Có cách nào để kết hợp và tận dụng tối đa cả hai thế giới? Ban đầu, tôi đã tìm cách để có được lỗi cuối cùng được kích hoạt trong khối onerror, nhưng có vẻ như JS không lưu trữ.

Bất kỳ đầu mối nào?

+0

để bắt lỗi ghi đè lên các chức năng như setTimeout và setInveral và đặt một vòng lặp cố gắng nắm bắt bên trong chúng. Bạn sẽ có thể nắm bắt tất cả các lỗi. Có lý ? –

Trả lời

10

Nếu bạn đang đề cập đến dấu vết ngăn xếp của đối tượng lỗi, thì AFAIK, điều này là không thể.

Lý do đơn giản là dấu vết ngăn xếp có liên quan đến ngữ cảnh thực thi trong đó ngoại lệ thời gian chạy (được xử lý bằng try ... catch ... final) được tạo hoặc ném (với new Error() hoặc throw).

Trong khi khi gọi window.onerror, nó được gọi trong một ngữ cảnh khác.

Bạn có thể lấy số dặm bằng cách kiểm tra window.event (không khả dụng trên FF) trong trình xử lý onerror của bạn.

+3

Dang. Theo dõi ngăn xếp thực sự là một trong những điều tôi đang tìm kiếm:/Không chắc tôi hiểu tại sao điều này không thể "tiếp tục" theo một cách nào đó, vì nó là một chuỗi các chuỗi mặc dù ... –

+0

Nó không tồn tại vì phạm vi trong mà nó được tạo ra không còn ở đó nữa. Trong trường hợp thử/nắm bắt, bạn vẫn ở trong phạm vi _that_. – Mrchief

+1

Hãy xem điều này: http: //helephant.com/2007/05/12/diy-javascript-stack-trace/ Có thể hữu ích trong trường hợp của bạn, không chắc chắn. – Mrchief

46

điều này hiện có thể thực hiện được trong một số trình duyệt. Các spec đã được cập nhật để bao gồm các lỗi thực tế với stacktrace là tham số thứ 5.

vấn đề là không phải mọi trình duyệt hỗ trợ này, vì vậy bạn có thể làm một cái gì đó như thế này:

window.onerror = function(message, filename, lineno, colno, error) 
{ 
    if(error != null) 
    { 
     //handle the error with stacktrace in error.stack 
    } 
    else 
    { 
     //sadly only 'message', 'filename' and 'lineno' work here 
    } 
}; 
+0

có cách nào tốt đẹp để chuyển lỗi này tới dịch vụ angular.js được chứa trong ứng dụng ng? – FutuToad

+4

hoạt động ít nhất trên Chrome, IE11 và Firefox> = 31. Tôi chưa thử nghiệm phiên bản Safari và di động. Dường như được hỗ trợ khá tốt ngay bây giờ. – frank

+0

@ user2151819 tin tuyệt vời – SuperUberDuper

5

Trình duyệt hiện tại hỗ trợ đầy đủ HTML 5 dự thảo spec cho ErrorEventwindow.onerror. Trong cả hai trong những trình duyệt bạn có thể sử dụng window.onerror, hoặc (đáng ngạc nhiên!) Bám vào các 'lỗi' sự kiện đúng:

// Only Chrome & Opera pass the error object. 
window.onerror = function (message, file, line, col, error) { 
    console.log(message, "from", error.stack); 
}; 
// Only Chrome & Opera have an error attribute on the event. 
window.addEventListener("error", function (e) { 
    console.log(e.error.message, "from", e.error.stack); 
}); 
Các vấn đề liên quan