5

Tôi đang chụp các lỗi js trong ứng dụng với window.onerror, nhưng vấn đề là - trong Chrome nếu công cụ dev không được mở - sau đó tham số url được chuyển đến onerror trình xử lý luôn bằng với url đã mở.Chụp các lỗi JS trong Chrome

Trong khi nếu công cụ dev được mở - thì url trỏ đến chính xác .js tệp gây ra lỗi js.

Làm thế nào để bạn đối phó với nó? Có cách giải quyết nào không?

Và để được rõ ràng hơn - đây là 2 kết quả:

  1. Uncaught ReferenceError: a is not defined index:122 - điều này đã được nhận sau khi lấy một trang
  2. Uncaught ReferenceError: a is not defined List.js:122 - điều này đã được nhận sau khi lấy cùng một trang với các công cụ dev mở. Đây là kết quả mong đợi - Tôi đã đặt số a(); gọi tới tệp List.js để thử nghiệm.

UPD: này được thực hiện để kiểm tra chức năng (sử dụng selen webdriver) - Tôi muốn chụp lỗi js để điều tra thêm.

+0

Nếu bạn đang tìm kiếm một ngoại lệ cần được sửa, tôi muốn mở tab Nguồn của công cụ dành cho nhà phát triển và sau đó sử dụng "Tạm dừng tất cả/ngoại lệ không bị bắt" ở dưới cùng bên trái của bảng điều khiển. –

+1

@ Fabrício Matté: nó là để thử nghiệm chức năng - Tôi muốn nắm bắt các lỗi js để điều tra thêm. Xin lỗi tôi đã không đề cập đến nó ban đầu – zerkms

Trả lời

1

Hãy đặt ra các kiến ​​trúc sau:

window.addEventListener("error", handleException, false); 

function handleException(I_sMsg) { 

    if (I_sMsg.stack) { 
      sMsg = I_sMsg.stack.replaceAll(getBaseURL(), ""); 
     alert(sMsg); 
    } else if (I_sMsg.message) { 
     alert(I_sMsg.message); 
    } 

    return cancelEvent(I_sMsg); 
} 

Bây giờ bất kỳ throw new Error("description"); sẽ đi qua phần đầu của câu lệnh if và có một chồng tốt đẹp cho bạn để phân tích với các url.

Nó cũng làm việc cho trường hợp ngoại lệ bất ngờ, có kết quả là được thông báo sau (trong trường hợp này sau khi gọi hàm unexisting bibi())

screenshot of an unexpected exception

Sau khi điều tra thêm, khuôn khổ của tôi đang sử dụng một số loại nhà thực hiện quản lý công việc (như được hiển thị trong ngăn xếp thực sự) trong đó mỗi hành động đơn lẻ thuộc về một công việc.

Công việc phương pháp thực hiện như sau (đơn giản hóa)

try { 
     oTask.func.apply(oTask.obj, oTask.prms); 
    } catch(ex) { 
     handleException(ex); 
     return false; 
    } 

Vì vậy, nó có nghĩa là mỗi thực đơn được đóng gói trong khối try catch duy nhất này. Như bạn thấy, số ngoại lệ bị bắt và được chuyển đến trình xử lý. Không phải lỗi .

Tôi mặc dù nó đang làm việc trong tệp khác nhưng đó là vì cuộc gọi đã được đóng gói, trong khi trong tệp api.js trực tiếp đó là một cuộc gọi miễn phí không được quản lý bởi khung.

+0

Nó không thực sự về xử lý lỗi cấp ứng dụng, nhưng về lỗi js không mong muốn, như gọi các hàm không có chức năng hoặc truy cập các thuộc tính của các biến không xác định. – zerkms

+0

vâng, nó cũng hoạt động. Tôi sẽ thêm một ảnh chụp màn hình trong 2 phút – Sebas

+0

mà sẽ là tốt đẹp, vì ví dụ của tôi với gọi không tồn tại 'a()' chức năng nó không cung cấp cho bất cứ điều gì mới – zerkms

1

Thêm một số điều gì đó để thử trả lời thực sự nhưng nó có thể hữu ích.

Chrome gần đây đã thêm chrome://inspect/ vào danh sách URL tiện dụng (xem chrome://chrome-urls/ để biết danh sách đầy đủ). Tôi không thể tìm thấy tweet hoặc bài đăng trên blog mà tôi đã đọc về điều này thật đáng tiếc nhưng tôi nghĩ rằng đó là trong tháng trước. URL hoạt động trên Chrome 28 chắc chắn.

chrome://inspect/ liệt kê tất cả các tab đang mở có liên kết kiểm tra chuyển hướng trở lại trang mở hiện có mà còn mở DevTools.

Tôi nghĩ rằng các thử nghiệm selen có thể mở trang web được kiểm tra trong một tab và trong một tab thứ hai mở kiểm tra trang, hãy làm theo các liên kết inspect trở lại trang thử nghiệm nhưng lần này với DevTools mở, cho phép window.onerror để nắm bắt các lỗi tốt hơn.

Cái gì như:

document.getElementsByClassName('row')[n].getElementsByTagName('a')[0].click() 
+0

"và trong một tab thứ hai mở trang kiểm tra" --- Tôi không chắc chắn, nhưng nếu nó có thể - thì đây có thể là một giải pháp, cảm ơn :-) – zerkms