2013-07-16 31 views
30

Ngoại lệ/lỗi trong nhiều ngôn ngữ lập trình khác (nói java, ruby) luôn cung cấp thông tin stacktrace/backtrace.Khi nào các dấu vết ngăn xếp thích hợp sẽ được cung cấp trên hàm window.onError?

Trong JavaScript unhandled Lỗi bị bắt bởi window.onError.

Mặc dù chức năng đó không nhận được đối tượng Lỗi, vì vậy chúng tôi không có quyền truy cập vào thuộc tính ngăn xếp của đối tượng.

Có nguồn thông tin đáng tin cậy nào về số khi sẽ có bất kỳ thay đổi nào về điều đó không?

+0

hy vọng không bao giờ, đó là vấn đề bảo mật lớn. – dandavis

+4

@dandavis làm thế nào nó sẽ là một vấn đề an ninh? người dùng có thể bước vào mã javascript với các công cụ trình duyệt cả ngày. với đủ nỗ lực họ có thể lấy dấu vết ngăn xếp – Kip

+0

vì nếu báo cáo đầy đủ lỗi, bạn có thể tải bất kỳ trang HTML nào dưới dạng tập lệnh [src] và thông báo lỗi sẽ phát ra nội dung HTML trong thông báo lỗi cú pháp, vi phạm SOP. – dandavis

Trả lời

10

Dường như chính đối tượng lỗi sẽ là thông số thứ năm được cung cấp cho onerror. http://html5.org/tools/web-apps-tracker?from=8085&to=8086
http://www.whatwg.org/specs/web-apps/current-work/ - phần 7.1.6.1

+1

Điều này là không đúng trong tất cả các trình duyệt. IE10 trả về arg là errorMessage, scriptFile, scriptLineNumber, scriptColumnNumber – Kip

+1

Theo [http://msdn.microsoft.com/en-us/library/ie/cc197053.aspx](http://msdn.microsoft.com/en- chúng tôi/thư viện/ie/cc197053.aspx) (cập nhật lần cuối ngày 22/7/2013) những gì bạn nói là không đúng sự thật. Bạn có thể vui lòng cung cấp một số tài liệu nói như vậy không? –

+1

tài liệu không nói rằng có một đối số thứ tư. nhưng nếu bạn thực sự thử nó (chỉ cần thử nó, tôi đã thử nó ngày hôm qua) bạn sẽ thấy arg thứ tư là số cột. nó có thể là một "tính năng" không có giấy tờ không phù hợp với tiêu chuẩn, nhưng chắc chắn không trả về đối tượng lỗi ban đầu – Kip

34

Đối tượng lỗi, có chứa một "vệ sinh" stack trace, hiện đang được thông qua tại như tham số thứ năm để onerror trong Chrome. Bạn có thể đọc về điều này tại đây: https://code.google.com/p/chromium/issues/detail?id=147127

Tại thời điểm viết bài này, nó ở Canary và sẽ được đẩy ra bản phát hành Chrome ổn định vào cuối tháng này. Nếu bạn đang chạy Canary bạn có thể kiểm tra nó như vậy:

window.onerror = function (message, file, line, column, errorObj) { 
    if(errorObj !== undefined) //so it won't blow up in the rest of the browsers 
     console.log('Error: ' + errorObj.stack); 
} 

Bạn có thể thấy theo spec rằng họ cũng đã thêm số cột mà IE 10 cũng đã thực hiện.

Bạn cũng có thể kiểm tra thảo luận trên Mozilla: https://bugzilla.mozilla.org/show_bug.cgi?id=355430

+0

Dường như cũng hoạt động trong firefox, sử dụng v34.0.5. –

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