2011-09-21 36 views
8

Tôi có một chút JavaScript (Jquery Tools' Overlay) có thể ném một ngoại lệ khi bị xóa trên trang sử dụng không chính xác và tôi đang cố gắng xử lý nó một cách duyên dáng.Bắt lỗi javascript trong tệp tập lệnh bên ngoài

Tôi có trình xử lý chung window.onerror để giải cứu các lỗi này và báo cáo lại cho máy chủ, tuy nhiên, điều đó không được kích hoạt.

Tôi cũng không thể quấn thử/nắm bắt xung quanh mã này vì mã được bao gồm dưới dạng tập lệnh từ xa trong HTML.

Bất kỳ ý tưởng nào về cách bạn có thể cứu các lỗi mà tập lệnh bên ngoài sẽ ném ra?

CẬP NHẬT: Đây là ví dụ. Tôi nên sửa bản thân mình, window.onerror không được kích hoạt, tuy nhiên tập lệnh không tiếp tục chạy (trong ví dụ, cảnh báo không bao giờ cảnh báo).

<html> 
<script type="text/javascript"> 
window.onerror = function(e){ console.log("caught error: "+e); return true;} 
</script> 
<body> 

<!-- this is the line in the dom that causes the script to throw --> 
<a rel="nofollow"></a> 

<script type="text/javascript" src="http://www.google.com/jsapi"></script> 
<script type="text/javascript">google.load("jquery", "1.4.1");</script> 
<script src="http://cdn.jquerytools.org/1.2.5/tiny/jquery.tools.min.js"></script> 

<script type="text/javascript"> 
//this code will throw an error in jquery tools 
$("a[rel]").overlay(); 

alert("it's ok, I still ran."); 
</script> 

</body> 

</html> 
+0

là 'window.onerror' của bạn được xác định trước khi lỗi được ném? Nếu không, nó sẽ không hoạt động. –

Trả lời

5

Xác định trình xử lý lỗi trước khi bất kỳ tập lệnh nào khác được tải/thực thi.

<script>window.onerror = function(e){}</script> 
<script src="external.js"></script> 
<script> 
function ole(){alert("Hi!")} 
ole(); 
</script> 

Khi kịch bản của bạn có lỗi cú pháp, xử lý lỗi sẽ không được gọi là mặc dù:

<script>window.onerror=function(e){alert("?")} 
<script> 
[email protected] //The error won't be caught. 
</script> 
+0

Cảm ơn, tôi vừa cập nhật câu hỏi. Nó thực sự đang kích hoạt onerror, tuy nhiên luồng điều khiển cũng dừng lại, thay vì tiếp tục. –

+0

Điều đó được mong đợi. Lỗi được tạo bởi '$', và không bị bắt bởi bất kỳ trình xử lý lỗi cục bộ nào. Khi một lỗi được ném, bất kỳ mã nào sau dòng đó không được thực thi nữa (mã được định nghĩa trong phạm vi toàn cục, trong trường hợp này). –

+0

Tấn công JavaScript tốt nhất trong năm x) bạn đã thực hiện ngày của mình –

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