Подтвердить что ты не робот

"бросить новое предупреждение" в JavaScript?

В настоящий момент я расширяю свой проект JavaScript с помощью обработки ошибок. Оператор throw играет здесь важную роль:

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

Однако могу ли я также предупредить? Я пробовал следующее безрезультатно:

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

Ошибки заставляют Chrome Developer Tools показывать красный крест, но как я могу заставить его отображать значок предупреждения (желтый восклицательный знак)?

4b9b3361

Ответ 1

Вот так:

console.warn('Hi!');

Обратите внимание, что в отличие от исключений, это не будет прерывать ваш код; вызывающая функция будет продолжаться в обычном режиме.

Также обратите внимание, что это приведет к ошибке в любом браузере, кроме WebKits или Firefox с Firebug, потому что console не будет существовать.

Чтобы исправить это, вы можете включить Firebug Lite или создать поддельный объект NOP-ing console.

Ответ 2

Используйте console.warn(...);

Обратите внимание, что он определен только в том случае, если есть консоль - например, в Firefox, только если FireBug активен. Поэтому, если вы используете это, не забудьте создать фиктивный объект консоли с использованием метода, если window.console не определен.

Ответ 3

Я не думаю, что вы можете бросить предупреждение в JavaScript.

Кроме того, вам лучше делать...

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

По словам Крокфорда, в любом случае: P

Ответ 4

Чтобы быть в безопасности, вы можете сделать это:

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

Я делаю что-то подобное в своих проектах, поскольку console.log более широко поддерживается, чем console.warn.

И если вы забудете его и отправите на производство (который не является мю-буено), анонимная функция его съест.

EDIT:

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

Работает намного лучше (спасибо @Solomon Ucko)

Ответ 5

Нет такой вещи, как исключение "предупреждение". Когда вы бросаете объект (и вы можете бросить в значительной степени что-либо), это исключение, которое либо поймано, либо нет.

Возможно, вы можете получить предупреждающий эффект, убедившись, что ваш код перехватывает исключения, исходящие из вашего кода, ища "предупреждающие" объекты каким-то образом (по типу или путем утиного ввода).

edit На протяжении многих лет это привлекало несколько downvotes, поэтому я расскажу об этом. 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() является правильным, но, конечно, это не очень похоже на бросание чего-то; это просто сообщение журнала. Выполнение продолжается, и если последующий код не может справиться с ситуацией, вызвавшей предупреждение, он все равно будет терпеть неудачу.