"бросить новое предупреждение" в JavaScript?
В настоящий момент я расширяю свой проект JavaScript с помощью обработки ошибок. Оператор throw
играет здесь важную роль:
throw new Error("text"); // Error: text
Однако могу ли я также предупредить? Я пробовал следующее безрезультатно:
throw new Warning("text"); // Warning is not defined
Ошибки заставляют Chrome Developer Tools показывать красный крест, но как я могу заставить его отображать значок предупреждения (желтый восклицательный знак)?
Ответы
Ответ 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()
является правильным, но, конечно, это не очень похоже на бросание чего-то; это просто сообщение журнала. Выполнение продолжается, и если последующий код не может справиться с ситуацией, вызвавшей предупреждение, он все равно будет терпеть неудачу.