Webアプリケーションのデバッグに問題があります。jsfiddleに投稿できる小さなWebページで問題を再現しようとしていたので、非常にイライラしますが、これは「Higgs-Bugson」の場合のようです。
jQuery(document).ready()
大きなハンドラーを持つWebページがあります。問題は、ハンドラー内から例外がスローされるjQuery(document).ready()
と、いくつかの無名関数を含む呼び出しスタックが取得され、実際に例外をスローしたコードへのポインターがないことです。
小さなWebページでこの動作を再現しようとすると、例外をスローしたコードへのポインターが常に取得されますが、本番コードでは、スタックポインターが取得されません。これにより、デバッグがより苛立たしくなり、エラーが発生しやすくなります。
ここにいる誰かが、この動作を引き起こしている可能性のあるものと、それを正しくする方法について何か考えがありますか?
更新:この質問を投稿してから数か月が経ちましたが、この問題を最終的に再現したと思います。次のHTMLで問題を再現します。
<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>
コードを見ると、ボタンをクリックすると、コードが指定した数値の階乗に警告を発していることがわかります。負の数を入力すると、エラーが発生します。この場合、Visual Studioはエラーをキャッチし、エラーが発生したコード行を強調表示して、とを含む呼び出しスタックを表示しfactorial
ますbtnFactorial_click
。
factorial(-1)
このコードは、$(document).readyハンドラーからも呼び出します。この場合、Visual Studioは、次のjQueryコード(987行目からjquery-1.6.1.jsから抜粋)のfinallyブロックにハイライトを移動します。
// 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;
},
呼び出しスタックは表示されませんが、VisualStudioはエラーのテキストを示すポップアップを表示します。
この奇妙な動作の理由は何ですか?また、$(document).readyなどのハンドラーから発生するエラーを簡単にトラップできるようにアプリケーションを設計するにはどうすればよいですか?