2

次のステートメントで呼び出した後、コードがエラーメッセージ(ページが空白)をスローして表示しない理由を理解しようとしています。

document.write(add(10、wrong_input));

program.js

var add = function (a,b){
    if(typeof a !== 'number' || typeof b !== 'number'){
        throw{
            name: 'TypeError',
            message: 'add needs numbers'
        } catch(e){
            document.writeln(e.name + ': ' + e.message);
        }
    }
    return a + b;
}

program.html

<html>
    <body>
    <pre><script src="program.js"></script></pre>
    <div></div>
    </body>
</html>
4

3 に答える 3

6

throwステートメントには句catchがありtryません。投げて捕まえるのは別々に。例えば:

var add = function (a,b){
    if(typeof a !== 'number' || typeof b !== 'number'){
        throw{
            name: 'TypeError',
            message: 'add needs numbers'
        }
    }
    return a + b;
}

try {
    add('foo', 1);
} catch(ex) {
    alert(ex.message);
}

ページの読み込み後に実行するとドキュメント全体が上書きされるため、を置き換えdocument.writelnたことに注意してください。alert見栄えの良いものが必要な場合は、DOMを直接操作します(要素のinnerHTMLを変更したり、ノードを追加したりするなど)。

于 2013-03-26T20:25:36.847 に答える
2

エラー処理コードが少しずれているため、エラーをスローしてから書き出すことはできません。あなたはどちらかをします:

if(typeof a !== 'number' || typeof b !== 'number'){
    document.write("TypeError" + ": " + "add needs numbers");
}

または単にそれだけthrow

if(typeof a !== 'number' || typeof b !== 'number'){
    throw {
        message: "add needs numbers",
        name: "TypeError"
    }
}

次にtry catch、関数呼び出しを実行します。個人的には、最初のものに固執すると思います。

于 2013-03-26T20:26:07.570 に答える
1

bfarettoがコメントしたように、あなたはスローとトライを混ぜています。

throwは、定義した例外をスローしますが、それをtry..catchブロックとして使用しています。これが、throwとtry..catchを一緒に使用する方法です。

var add = function (a,b){
    try {
       if(typeof a !== 'number' || typeof b !== 'number'){
            var n = {
                name: 'TypeError',
                message: 'add needs numbers'
            };
            throw n;
        }
        // throws an exception with a numeric value
    } catch (e) {
       console.log(e.name);
    }
} 
于 2013-03-26T20:34:50.627 に答える