web-dev-qa-db-ja.com

JavaScriptで「新しい警告を投げる」?

現時点では、JavaScriptプロジェクトをエラー処理で拡張しています。 throwステートメントは、ここで重要な役割を果たしています。

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

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

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

エラーによりChromeのデベロッパーツールに赤い十字が表示されますが、警告アイコン(黄色の感嘆符)を表示するにはどうすればよいですか?

46
pimvdb

このような:

console.warn('Hi!');

例外とは異なり、これによってコードが中断されることはありません。呼び出し機能は通常どおり続行されます。

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

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

72
SLaks

console.warn(...);を使用します

コンソールがある場合にのみ定義されることに注意してください。 Firefoxでは、FireBugがアクティブな場合のみ。したがって、それを使用する場合は、ifwindow.console 定義されていません。

4
ThiefMaster

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

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

console.logconsole.warn より広くサポートされているため、私は自分のプロジェクトでも同様のことをしています。

そして、それを忘れて本番( 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に感謝)

4
Campbeln

「警告」という例外はありません。あなたがオブジェクトを投げるとき(そしてあなたはかなり投げることができるanything)、それはキャッチされるかされないかのどちらかである例外です。

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

editこれは何年にもわたっていくつかの反対票を集めてきたので、答えを拡大します。 OPは明示的に尋ねました"警告をスローすることもできますか?" "警告"コンストラクターがある場合、その答えは "はい"です。

_function Warning(msg) {
  this.msg = msg;
}
_

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

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

もちろん、それでうまくいきますが、それは

_if (somethingIsWrong())
  throw "Something is wrong!";
_

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

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

3
Pointy

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

また、あなたはより良いことをしています...

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

Crockfordによると、とにかく:P

3
alex

私が今のように誰かがこの数年後にまだ検索している場合に備えて、私はPointyの(正しい)答えが私の質問への答えを見つけるために私を導いたものであることを指摘したいと思います:カスタムの「警告」をスローできますか?オブジェクト?

ポインティは、「あなたはほとんど何でも投げることができる」と指摘し、throwのドキュメントに私を導きました:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/throw

抜粋:

// Syntax
throw expression; // expression to throw

// Examples
throw 'Error2'; // generates an exception with a string value
throw 42;       // generates an exception with the value 42
throw true;     // generates an exception with the value true
throw new Error('Required');  // generates an error object with the message of Required

// Throw an object - you can specify an object when you throw an exception. You can then reference the object's properties in the catch block. The following example creates an object of type UserException and uses it in a throw statement.

// Example
function UserException(message) {
   this.message = message;
   this.name = 'UserException';
}
function getMonthName(mo) {
   mo = mo - 1; // Adjust month number for array index (1 = Jan, 12 = Dec)
   var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul',
      'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
   if (months[mo] !== undefined) {
      return months[mo];
   } else {
      throw new UserException('InvalidMonthNo');
   }
}

try {
   // statements to try
   var myMonth = 15; // 15 is out of bound to raise the exception
   var monthName = getMonthName(myMonth);
} catch (e) {
   monthName = 'unknown';
   console.log(e.message, e.name); // pass exception object to err handler
}

完全なクレジットは、(未確認の)正しい答えを与えるためにまだPointyに送られます。私はドキュメントと例を補足するだけです

追伸申し訳ありませんが、私はあなたを賛成するほどの評判すらありません(13/15):-(

1
caffeinatedbits