3

私は次のコードを持っています:

try {
    ...

    try {
        // This is *never* called
        alert('TRY');
    } catch (e) {
        // But this *is* called
        alert('CATCH');
    }

} catch (e2) {
    ...
}

問題は、内部ブロックからのアラートは実行されますが、内部catchブロックからのアラートは実行されないことtryです。

これは仕様ごとに可能ですか、それともここで何が起こっているのか誰かが知っていますか?
たとえば非同期コードからの例外が別のcatchブロックのコンテキストに実行される可能性はありますか?

これは私がそこに入れた実際のコードであり、内側のtry/に省略がないことに注意してくださいcatch。一部の非同期コードは、ブロックに入る前に実行される場合があります。

これは、PyQt4.9.0およびQt4.8.0のWebKit/QtWebKitで実行されているWebアプリから取得したコードからのものです。


さて、ここで、内側のtry / catch(最初の省略記号がある場所)の前にいくつかのコードを追加します。

DoSomething(function () {
    var updatePromises = [];
    var p;

    for (...) {
        p = new Promise();
        updatePromises.push(p);

        // Run asynchronous code to fulfill promise.
        // Calls are chained using an array and a "setTimeout()" mechanism.
        tasks.chain(function (promise) { ... }, this, p);
    }

    (function () {
         ...
    }).future().apply(this, updatePromises);
}.bind(this));
4

2 に答える 2

1

mozillaリファレンスに基づくと、答えはノーだと思います。ブロックが出入りするたびにログに記録し、見逃した奇妙なことが起こっていないかどうかを確認することをお勧めします。多分あまりにも使用します。debugger;

または、おそらくこれを試してください:

var foo = false;
try {
    try {
        foo = true;
        throw true;
    } catch (e) {
        if(foo) {
            alert('CATCH');
        } else {
            alert('HUH?');
        }
    }
} catch (e2) {
    alert('CATCH2');
}
于 2012-06-19T15:38:48.137 に答える
1

ES5仕様には、次のように記載されています(強調が追加されています)。

tryステートメントは、ランタイムエラーやthrowステートメントなどの例外的な状態が発生する可能性のあるコードのブロックを囲みます。catch句は、例外処理コードを提供します。

..。

本番のTryStatementtry Block Catchは、次のように評価されます。

  1. BをBlockの評価結果とします
  2. B .typeがスローされない場合は、 Bを返します。
  3. パラメータBを使用してCatchを評価した結果を返します。

私の理解では、仕様によれば、最初にtryブロックを評価せずにcatchブロックを実行する方法はありません。

于 2012-06-19T15:50:34.237 に答える