2009-03-14 26 views
8

Tôi hiện đang làm việc trên một ứng dụng web, tôi có một cơ chế ghi nhật ký JS xử lý lỗi Javascript mà không bị bắt gặp bởi mã js bên trong trang. Tôi đang sử dụng window.onerror để nắm bắt tất cả các lỗi như vậy và đăng nhập chúng ở nơi khác.Cửa sổ bắt chước. onerror trong Opera bằng cách sử dụng javascript

Tuy nhiên, sự cố xảy ra với Opera không có sự kiện window.onerror. một cách tiếp cận tôi có thể nghĩ đến là, để xử lý chuỗi tất cả các mã hàm js và chèn hãy thử chặn các khối bên trong các hàm đó sau khi tải nội dung. Nó không hoạt động trong nhiều trường hợp, tuy nhiên, nó ít nhất là hoạt động ở một mức độ nào đó.

Tôi chắc chắn cách tiếp cận này hút, Nhưng, tôi không thể nghĩ ra bất cứ điều gì tốt hơn. Vui lòng thông báo.

Cập nhật: Hiện tại, tôi đang gọi mã bên dưới để Bắt được nhiều lỗi nhất có thể.

function OnBodyLoad() 
{ 
     var allElements = document.getElementsByTagName("*"); 
     for(var cnt = 0;cnt < allElements.length;cnt++) 
     { 
      RegisterAllEvents(allElements[cnt]); 
     } 
} 
function RegisterAllEvents(objToProcess){ 
    for(var cnt = 0;cnt < objToProcess.attributes.length;cnt++){ 
     if(IsAttributeAnEvent(objToProcess.attributes[cnt].name)) 
     { 
      objToProcess.attributes[cnt].value = 'try{'+objToProcess.attributes[cnt].value+'}catch(err){LogError("'+ objToProcess.id+'"'+ ',err);}'; 
     } 
    } 
} 
+1

Cảm ơn bạn đã nhập mã! Chúng tôi có thể kết thúc bằng cách sử dụng trong chế độ phát triển tại công ty chúng tôi (nếu nó không phải là quá chậm). –

Trả lời

2

Điều này cũng xảy ra trên Safari, AFAIK.

Những gì bạn có thể chắc chắn làm là tạo ra một khối try/catch toàn cầu cho tất cả các mã JS thay vì phân tích cú pháp văn bản - mà có thể là phức tạp nếu bạn đi vào những thứ như:

(function ($){ 
    $(function(){ 
    }); 
})(jQuery); 
+0

bạn đang nói một cái gì đó như thế này sẽ làm việc? Nó không: thử { hàm Nguyên nhânError() { // làm gì đó để ném lỗi document.getElementById ('hjsdfkas'). Yeye = 'yyryr'; cảnh báo ('kiểm tra'); } } bắt (e) { cảnh báo ('đã xảy ra lỗi'); } – kalyang

+0

Vâng, điều đó sẽ hoạt động :) – Seb

+0

+1 cũng xảy ra trong Safari. – scunliffe

9

Opera 11.60+ hỗ trợ window.onerror.

Opera Dragonfly hỗ trợ remote debugging. Bạn có thể có thể hack it (tất cả được viết bằng JavaScript) và tự ghi lại lỗi (không may là giao thức isn't published yet).

+0

+1 để lưu lỗi với Opera. 'window.onerror' được định nghĩa trong JavaScript 1.1 (hơn một thập kỷ trước) – scunliffe

+1

Đó là một giới hạn đã biết, không cần báo cáo lỗi. – hallvors

+0

** Opera 11.60 ** cũng hỗ trợ nó. – c69

5

bạn có thể thay thế Error.prototype.toString trong Opera!

window.onerror = function (msg) { 
    // send msg to http://errors.net/log.php, for example 
    (new Image()).src = 'http://errors.net/log.php?msg=' + encodeURIComponent(msg); 
}; 
if (({}).toString.call(window.opera) === '[object Opera]') { 
(function() { 
    var x = Error.prototype.toString; 
    Error.prototype.toString = function() { 
    var msg = ''; 
    try { 
     msg = x.apply(this, arguments); 
     if (typeof (window.onerror) === "function") { 
     window.onerror(msg, typeof (this) === 'object' ? this.stack : '', ''); 
     } 
    } catch (e) {} 
    return msg; 
    }; 
}()); 
} 

vẻ như, nó không làm việc cho Opera 11.50 ... chỉ dành cho phiên bản đầu ...

0

có một đề cập đến ở đây là Opera bây giờ hỗ trợ window.onerror:

http://my.opera.com/ODIN/blog/2011/11/07/what-s-new-in-opera-development-snapshots-4-november-2011-edition

nhưng window.onerror dường như không hoạt động trong Opera Mini (ví dụ: tác nhân người dùng "Opera/9.80 (J2ME/MIDP; Opera Mini/7.1.32422/30.3214; U; en) Presto/2.8.119 Phiên bản/11.10"). Điều này làm cho nó thực sự khó khăn để gỡ lỗi javascript trên điện thoại di động với Opera Mini.

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