«Добавить новое предупреждение» в JavaScript? - PullRequest
43 голосов
/ 04 марта 2011

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

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

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

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

Из-за ошибок в инструментах разработчика Chrome красный крестик отображается, но как сделать так, чтобы на нем отображался значок предупреждения (желтый восклицательный знак)?

Ответы [ 6 ]

72 голосов
/ 04 марта 2011

Как это:

console.warn('Hi!');

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

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

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

4 голосов
/ 28 октября 2014

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

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

Я делаю нечто подобное в своих проектах, поскольку console.log поддерживается более широко, чем console.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 голосов
/ 04 марта 2011

Использование console.warn(...);

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

3 голосов
/ 04 марта 2011

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

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

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

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

3 голосов
/ 04 марта 2011

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

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

edit За последние годы это привело к снижению рейтинга, поэтому я остановлюсь на ответе. ОП явно спросил «Могу ли я также выдать предупреждение?» Ответ на этот вопрос может быть «да», если у вас есть конструктор «Предупреждение»:

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

1 голос
/ 15 марта 2019

На тот случай, если кто-то еще будет искать эти годы спустя, как я только что сейчас, я хотел бы отметить, что (правильный) ответ Пойнти привел меня к поиску ответа на мой вопрос: могу ли я бросить обычай? «Предупреждение» объекта?

Пойнти указал, что «вы можете бросить почти все», что привело меня к документам на 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 за то, что он дал (неподтвержденный) правильный ответ, я просто дополняю документами и примерами

P.S. Извините, Пойнти, у меня даже недостаточно репутации, чтобы поддержать вас (13/15): - (

...