Tôi gặp sự cố khi gỡ lỗi các ứng dụng web của mình. Nó rất bực bội vì tôi đã cố gắng tái tạo vấn đề với một trang web nhỏ mà tôi có thể đăng trên jsfiddle, nhưng điều này có vẻ là một trường hợp của "Higgs-Bugson".Ngăn xếp cuộc gọi bị mất khi một ngoại lệ được ném trong trình xử lý jQuery
Tôi có trang web có trình xử lý jQuery(document).ready()
lớn. Vấn đề là khi một ngoại lệ được ném từ bên trong trình xử lý jQuery(document).ready()
, tôi nhận được một cuộc gọi ngăn xếp với một số hàm ẩn danh và không có con trỏ tới mã thực sự đã ném ngoại lệ.
Bất cứ khi nào tôi cố gắng tái tạo hành vi này với một trang web nhỏ, tôi luôn có được một con trỏ đến mã mà ném ngoại lệ, nhưng trong mã sản xuất, tôi không bao giờ có được con trỏ ngăn xếp. Điều này làm cho việc gỡ rối thêm bực bội và dễ bị lỗi.
Có ai ở đây có bất kỳ ý tưởng nào có thể gây ra hành vi này và cách thực hiện đúng không?
Cập nhật: Đã vài tháng kể từ khi tôi đăng câu hỏi này và bây giờ tôi tin rằng tôi đã thuyết phục sao chép vấn đề này. Tôi tạo lại vấn đề với HTML sau:
<html xmlns="http://www.w3.org/1999/xhtml" >
<body>
Factorial Page
<input type='button' value='Factorial' id='btnFactorial' />
<script src="Scripts/jquery-1.6.1.js" type="text/javascript"></script>
<script type='text/javascript'>
$(document).ready(documentReady);
function documentReady() {
$('#btnFactorial').click(btnFactorial_click);
factorial(-1);
}
function btnFactorial_click() {
var x;
x = prompt('Enter a number to compute factorial for.', '');
alert(x + '! = ' + factorial(x));
}
function factorial(x) {
if (x < 0)
throw new Error('factorial function doesn\'t support negative numbers');
else if (x === 0 || x === 1)
return 1;
else
return factorial(x - 1) * x;
}
</script>
</body>
</html>
Nhìn vào mã, bạn sẽ thấy cảnh báo số của số bạn chỉ định. Nhập số âm và lỗi sẽ được tạo. Trong trường hợp này, Visual Studio sẽ bắt lỗi và làm nổi bật dòng mã nơi xảy ra lỗi và hiển thị ngăn xếp cuộc gọi bao gồm factorial
và btnFactorial_click
.
Mã này cũng gọi factorial(-1)
từ trình xử lý $ (tài liệu) .ready. Trong trường hợp này, Visual Studio di chuyển nổi bật với khối finally trong mã jQuery sau (trích từ jquery-1.6.1.js, bắt đầu vào dòng 987
// resolve with given context and args
resolveWith: function(context, args) {
if (!cancelled && !fired && !firing) {
// make sure args are available (#8421)
args = args || [];
firing = 1;
try {
while(callbacks[ 0 ]) {
callbacks.shift().apply(context, args);
}
}
finally {
fired = [ context, args ];
firing = 0;
}
}
return this;
},
Mặc dù các cuộc gọi stack không được hiển thị, Visual Studio Lý do cho hành vi kỳ quặc này là gì và làm thế nào tôi có thể thiết kế ứng dụng của mình để tôi có thể dễ dàng bẫy các lỗi bắt nguồn từ các trình xử lý như $ (tài liệu) .đã có sẵn. ?
+1 cho Higgs-Bugson –
Bạn có thể đăng mẫu mã không? – izb
@izb, sự cố luôn xuất hiện trong mã sản xuất của tôi (mà tôi không thể đăng ở đây), nhưng không bao giờ xuất hiện trong mã thử nghiệm mà tôi viết để cố tách biệt vấn đề. –