JavaScript: Як надрукувати повідомлення на консолі помилок?


438

Як я можу надрукувати повідомлення на консоль помилки, бажано включаючи змінну?

Наприклад, щось на кшталт:

print('x=%d', x);

8
Про яку консоль ви говорите. Консоль браузера чи конкретну консоль JavaScript?
Ерік Шкоуновер

Пов’язана публікація - Chrome: console.log, console.debug не працює
RBT

Відповіді:


469

Встановіть Firebug, а потім ви можете використовувати console.log(...)і console.debug(...)тощо (див . Документацію для отримання додаткової інформації).


14
@Dan: Веб-інспектор WebKit також підтримує API консолі
FireBug

160
чому це прийнята відповідь? він не запитував, як записати на консоль firebug, він запитав, як записати на консоль помилок. не бути хуй чи іншим, просто вказати на це.
матовий lohkamp

127
+1. І на користь того, хто зараз стикається з цим питанням, варто зазначити, що оскільки відповіли на запитання, усі браузери зараз реалізували об’єкт консолі, тому console.log()тощо повинні працювати у всіх браузерах, включаючи IE. Однак у всіх випадках вам потрібно буде відкрити вікно налагодження в той час, інакше дзвінки до consoleгенеруватимуть помилки.
Спудлі

2
@andrewjackson, як зазначалося раніше, console.log чудово працює у всіх сучасних браузерах, включаючи IE. Ваш код все ще є абсолютно дійсним і корисним, якщо ви маєте намір підтримувати старіші веб-переглядачі (і якщо ви працюєте на загальнодоступному веб-сайті, ви впевнені, як слід!), Проте моя критика лише в тому, що ваш коментар вводить в оману / не є точним.
BrainSlugs83

1
console.debug (), з іншого боку, не існує в IE. Ми можемо обійти це за допомогою: if (! Console.debug) {console.debug = function (args) {console.log (args); }}
Рованіон

318
console.error(message); //gives you the red errormessage
console.log(message); //gives the default message
console.warn(message); //gives the warn message with the exclamation mark in front of it
console.info(message); //gives an info message with an 'i' in front of the message

Ви також можете додати CSS до своїх журналів реєстрації:

console.log('%c My message here', "background: blue; color: white; padding-left:10px;");

8
Документація на хром: developers.google.com/chrome-developer-tools/docs/console
mrzmyr

10
Це правильна відповідь. Слово "помилка" навіть не згадується у вибраній відповіді, хоча воно є у назві питання.
Іван Дерст

3
Додатковий біт щодо додавання CSS - це дуже цікаво. +1!
sudo make install

@ORMapper Що там не працює? CSS я припускаю?
Миколай

2
У той момент, коли ти це зрозумієш, за всі ці роки використання console.logти можеш використовувати css всередині консолі: |
Червоний

86

Винятки входять у консоль JavaScript. Ви можете використовувати це, якщо ви хочете, щоб Firebug не був відключений.

function log(msg) {
    setTimeout(function() {
        throw new Error(msg);
    }, 0);
}

Використання:

log('Hello World');
log('another message');

8
У деяких веб-переглядачах, якщо ви ввімкнули налагодження, це передаватиме спливаючі повідомлення.
BrainSlugs83

Не могли б ви пояснити, чому це throwповинно бути загорнуте в setTimeout?
Антоній

55

Один хороший спосіб зробити це, що працює між браузером, викладений у налагодженні JavaScript: Викиньте свої сповіщення! .


7
кидок () - чудова пропозиція - це має бути обрана відповідь.
матовий lohkamp

17
Погоджено, це один крос-браузерний підхід. Але .. Чи не кидання винятку принципово відрізняється від реєстрації повідомлень?
Робін Мабен

14
З іншого боку, кидання винятку зупинить виконання поточної "нитки" (як зазначає Юваль А) та відновить її в уловці, якщо така є. Сумніваюсь, що саме цього бажано.
dlaliberte

7
throw()це точно не спосіб зробити це. Ви рано чи пізно потрапите в біду. для мене це було швидше :(
Hugo Mota

4
@Ian_Oxley: в якийсь момент воно було відхилене, тепер воно резервне копіювання, але розміщення коду тут ще краще, і рекомендовано найкращими методами stackoverflow.
woohoo

15

Ось вирішення буквального питання про те, як надрукувати повідомлення на консолі помилки браузера, а не на консолі налагодження. (Можливо, будуть вагомі причини обходити налагоджувач.)

Як я зазначив у коментарях щодо пропозиції викинути помилку для отримання повідомлення на консолі помилок, одна проблема полягає в тому, що це перерве потік виконання. Якщо ви не хочете переривати потік, ви можете перекинути помилку в окремий потік, створений за допомогою setTimeout. Звідси моє рішення (яке, як виявляється, є розробкою рішення Іво Даниелки):

var startTime = (new Date()).getTime();
function logError(msg)
{
  var milliseconds = (new Date()).getTime() - startTime;
  window.setTimeout(function () {
    throw( new Error(milliseconds + ': ' + msg, "") );
  });
}
logError('testing');

Я включаю час у мілісекундах від часу початку, оскільки час очікування може перекрутити порядок, у якому ви можете розраховувати на перегляд повідомлень.

Другий аргумент методу Помилка - це ім'я файлу, який є порожньою рядком для запобігання виводу марного імені файлу та номера рядка. Можна отримати функцію виклику, але не простим незалежним способом браузера.

Було б добре, якби ми могли відобразити повідомлення із значком попередження чи повідомлення замість піктограми помилки, але я не можу знайти спосіб це зробити.

Ще одна проблема використання кидання полягає в тому, що його можна було б спіймати і викинути додаючим спробу-лову, а введення кидка в окрему нитку також уникне цієї перешкоди. Однак існує ще один спосіб помилки, який можна виявити, якщо обробник window.onerror замінити на той, що робить щось інше. Не можу вам там допомогти.


15

Якщо ви використовуєте Safari , можете писати

console.log("your message here");

і відображається прямо на консолі браузера.


11
Всі сучасні браузери підтримують console.log().
JJJ

2
Всі сучасні браузери зараз підтримують console.log(). Це було не так до недавнього часу.
Брайс

9

Справді відповісти на питання:

console.error('An error occurred!');
console.error('An error occurred! ', 'My variable = ', myVar);
console.error('An error occurred! ' + 'My variable = ' + myVar);

Замість помилки ви також можете використовувати інформацію, журнал чи попереджати.


Ваша відповідь здається найкращою, але сторінка MDN Mozilla каже console.error(..), що це нестандартна функція, і її не слід використовувати у виробництві. Що ви ставитесь до цього? Чи є якісь пропозиції для початківця програміста, що використовує console.errorvs console.log?
modulitos

Це цікаво. Ми не повинні використовувати це тоді. Дякую за інформацію, Лукасе.
Yster

2
MDN також вважає console.log(...)"нестандартним". У цьому плані console.errorвін такий же стабільний console.log.
Майк Рападас

1
@Lucas Кому все одно, чи це стандарт? Хто буде використовувати консольний журнал для виробництва?
Андрій

Console.error працює зараз у всіх основних браузерах. Навіть IE8. Дивіться developer.mozilla.org/en-US/docs/Web/API/Console/error
Червоний

8

Якщо ви використовуєте Firebug і вам також потрібно підтримувати IE, Safari або Opera, Firebug Lite додає підтримку console.log () до цих браузерів.


2
Нічого ... Firebug Lite приголомшливий
Dexter


5

Примітка про "кинути ()", згадану вище. Здається, що він повністю зупиняє виконання сторінки (я перевірив в IE8), тому це не дуже корисно для входу в систему "на поточні процеси" (наприклад, відстежувати певну змінну ...)

Моя пропозиція, можливо, додати елемент текстової області десь у вашому документі та змінити (або додати до нього) його значення (яке змінило б його текст) для реєстрації інформації, коли це потрібно ...


Я здогадуюсь це тому, що ви не відповіли на питання ОП. Для друку на консолі JS необхідно використовувати вбудований метод на зразок console.log()і throw()т. Д. Крім того, в поведінці немає нічого поганого, throw()як вам здається, - факт, що він зупиняє виконання, є навмисним і документально підтвердженим ( розробник. mozilla.org/en-US/docs/Web/JavaScript/Reference/… ), і це відповідає тому, як винятки кидаються / потрапляють в інші мови програмування. (Якщо ви хочете записати вміст змінної, не зупиняючи виконання, саме console.log()для цього.)
Sean the Bean

@SeantheBean, спочатку була дискусія про те, що IE не підтримував console.log- тому люди давали альтернативи. Про throw()припинення виконання, звичайно, це навмисно, ніхто не сказав, що це не так. Ось чому, як правило, це не дуже вдалий спосіб увімкнути інформацію про налагодження під час виконання, чого саме хотіла ОП ...
Ювал А.

5

Як завжди, Internet Explorer - це великий слон, який зупиняє вас просто на використанні console.log().

Журнал jQuery можна легко адаптувати, але це біль, що його потрібно додавати скрізь. Одне з варіантів, якщо ви використовуєте jQuery, - це помістити його у свій файл jQuery наприкінці, спершу сформульоване:

function log()
{
    if (arguments.length > 0)
    {
        // Join for graceful degregation
        var args = (arguments.length > 1) ? Array.prototype.join.call(arguments, " ") : arguments[0];

        // This is the standard; Firebug and newer WebKit browsers support this.
        try {
            console.log(args);
            return true;
        } catch(e) {
            // Newer Opera browsers support posting erros to their consoles.
            try {
                opera.postError(args);
                return true;
            } 
            catch(e) 
            {
            }
        }

        // Catch all; a good old alert box.
        alert(args);
        return false;
    }
}

Тепер це прийнято як розширення jQuery, але чи не було б ефективним перевірити, чи існують об'єкти "console" та "opera", перш ніж вибирати виняток?
Дунайський матрос

@lechlukasz Я думаю, ви можете зберегти накладні розширення та просто скористатися console.log плюс ця перевірка IE: stackoverflow.com/questions/1215392/…
Chris S


3

function foo() {
  function bar() {
    console.trace("Tracing is Done here");
  }
  bar();
}

foo();

console.log(console); //to print console object
console.clear('console.clear'); //to clear console
console.log('console.log'); //to print log message
console.info('console.info'); //to print log message 
console.debug('console.debug'); //to debug message
console.warn('console.warn'); //to print Warning
console.error('console.error'); //to print Error
console.table(["car", "fruits", "color"]);//to print data in table structure
console.assert('console.assert'); //to print Error
console.dir({"name":"test"});//to print object
console.dirxml({"name":"test"});//to print object as xml formate

To Print Error:- console.error('x=%d', x);

console.log("This is the outer level");
console.group();
console.log("Level 2");
console.group();
console.log("Level 3");
console.warn("More of level 3");
console.groupEnd();
console.log("Back to level 2");
console.groupEnd();
console.log("Back to the outer level");


1
console.log("your message here");

працює для мене .. Я шукаю це .. я використовував Firefox. ось мій сценарій.

 $('document').ready(function() {
console.log('all images are loaded');
});

працює в Firefox та Chrome.




0

Це не надрукується на консолі, але відкриє вам сповіщення Popup із повідомленням, яке може бути корисним для налагодження:

просто роби:

alert("message");

Це нічого спільного з тим, що просив ОП
Зефір Здравков

0

З синтаксисом es6 ви можете використовувати:

console.log(`x = ${x}`);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.