60

現在、JavaScript プロジェクトをエラー処理で拡張しています。このthrow声明はここで重要な役割を果たしています。

throw new Error("text"); // Error: text

ただし、警告をスローすることもできますか? 私は無駄に次のことを試しました:

throw new Warning("text"); // Warning is not defined

エラーにより、Chrome の開発者ツールに赤い十字が表示されますが、警告アイコン (黄色のエクスクラメーション マーク) を表示するにはどうすればよいですか?

4

6 に答える 6

90

このような:

console.warn('Hi!');

例外とは異なり、これはコードを中断しないことに注意してください。呼び出し関数は正常に続行されます。

また、存在しないため、WebKits または Firebug を使用する Firefox を除くすべてのブラウザーでエラーがスローされることに注意してくださいconsole

これを修正するには、Firebug Liteを含めるか、偽の NOP-ingconsoleオブジェクトを作成します。

于 2011-03-04T00:13:42.397 に答える
7

「警告」例外のようなものはありません。オブジェクトをスローすると (そしてほとんど何でもスローできます)、それはキャッチされるかどうかのいずれかの例外です。

コードがコード内から発生する例外をインターセプトし、何らかの方法で (タイプまたはダックタイピングによって) 「警告」オブジェクトを探すことで、警告効果を達成できる可能性があります。

編集これは長年にわたっていくつかの反対票を集めてきたので、答えを拡大します. OPは明示的に「警告を出すことはできますか?」と尋ねました。「警告」コンストラクターがある場合、その答えは「はい」になる可能性があります。

function Warning(msg) {
  this.msg = msg;
}

その後、あなたは確かに行うことができます

if (somethingIsWrong())
  throw new Warning("Something is wrong!");

もちろん、それはうまくいきますが、それはそれほど違いはありません

if (somethingIsWrong())
  throw "Something is wrong!";

何かをスローする場合、それらは何でもかまいませんが、スタック トレースが付属しているため、スローするのに役立つのは Error インスタンスです。いずれにせよ、ステートメントが存在するか存在しないかのどちらかですが、ブラウザー自体は、スローされたオブジェクトがインスタンスcatchであることを気にしません。Warning

他の回答が指摘しているように、本当の目標がコンソール出力に影響を与えるだけであれば、それconsole.warn()は正しいですが、もちろんそれは何かを投げることに匹敵するものではありません。それは単なるログメッセージです。実行は続行され、後続のコードが警告をトリガーした状況に対処できない場合でも、失敗します。

于 2011-03-04T00:11:41.883 に答える
5

JavaScript で警告をスローすることはできないと思います。

また、あなたはした方が良いです...

throw {
   name: 'Error',
   message: 'Something error\'d'
}

クロックフォードによれば、とにかく :P

于 2011-03-04T00:11:47.003 に答える
5

安全にするために、これを行うことができます:

(console ? (console.warn || console.log) : function (m) { return m; })
    ("warning text goes here")
;

console.logよりも広くサポートされているため、プロジェクトで同様のことを行いますconsole.warn

そして、それを忘れて本番環境 ( non-muy-bueno ) に送信すると、無名関数がそれを食べてしまいます。

編集:

var notConsole = {
    log: function() {
        try {
            console.log.apply(this, arguments);
        } catch(e) {}
    },
    warn: function() {
        try {
            console.warn.apply(this, arguments);
        } catch(e) {}
    }
}

はるかにうまく機能します(@Solomon Uckoに感謝)

于 2014-10-28T03:52:56.197 に答える
4

使用するconsole.warn(...);

コンソールがある場合にのみ定義されることに注意してください。たとえば、FireBug がアクティブな場合にのみ Firefox で定義されます。window.consoleしたがって、それを使用する場合は、定義されていない場合に使用するメソッドでダミーのコンソール オブジェクトを作成することを忘れないでください。

于 2011-03-04T00:15:20.573 に答える