JavaScript: ฉันจะพิมพ์ข้อความไปยังคอนโซลข้อผิดพลาดได้อย่างไร


438

ฉันจะพิมพ์ข้อความไปยังคอนโซลข้อผิดพลาดโดยเฉพาะอย่างยิ่งรวมถึงตัวแปรได้อย่างไร

ตัวอย่างเช่น:

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

8
คุณกำลังพูดถึงคอนโซลใด คอนโซลเบราว์เซอร์หรือคอนโซล JavaScript เฟรมเวิร์กเฉพาะ
Eric Schoonover

โพสต์ที่เกี่ยวข้อง - Chrome: console.log, console.debug ไม่ทำงาน
RBT

คำตอบ:


469

ติดตั้งFirebugจากนั้นคุณสามารถใช้console.log(...)และconsole.debug(...)อื่น ๆ (ดูเอกสารประกอบเพิ่มเติม)


14
@Dan: WebKit Web Inspector ยังรองรับคอนโซล FireBug API
olliej

160
ทำไมนี่คือคำตอบที่ยอมรับได้? เขาไม่ได้ถามวิธีการเขียนไปยังคอนโซล firebug เขาถามวิธีการเขียนไปยังคอนโซลข้อผิดพลาด ไม่ใช่การเป็นแค่ดิ๊กหรืออะไรเลยเพียงแค่ชี้มันออกมา
matt lohkamp

127
+1 และเพื่อประโยชน์ของทุกคนที่มาถึงคำถามนี้ในตอนนี้มันก็คุ้มค่าที่ชี้ให้เห็นว่าเนื่องจากคำถามได้รับคำตอบแล้วเบราว์เซอร์ทั้งหมดได้นำวัตถุคอนโซลมาใช้ดังนั้นจึงconsole.log()ควรทำงานในเบราว์เซอร์ทั้งหมดรวมถึง IE อย่างไรก็ตามในทุกกรณีคุณจำเป็นต้องเปิดหน้าต่างดีบักเกอร์ในเวลานั้นมิฉะนั้นการเรียกเพื่อconsoleจะสร้างข้อผิดพลาด
Spudley

2
@andrewjackson ตามที่ระบุไว้ก่อนหน้านี้ console.log ทำงานได้ดีในเบราว์เซอร์ที่ทันสมัยรวมถึง IE รหัสของคุณยังคงสมบูรณ์และมีประโยชน์หากคุณต้องการสนับสนุนเบราว์เซอร์รุ่นเก่า (และหากคุณกำลังทำงานในเว็บไซต์สาธารณะคุณแน่ใจว่าควรจะเป็น!) อย่างไรก็ตามคำวิจารณ์ของฉันเป็นเพียงความคิดเห็นของคุณทำให้เข้าใจผิด / ไม่ถูกต้อง
BrainSlugs83

1
console.debug () ในอีกทางหนึ่งไม่มีอยู่ใน IE เราสามารถแก้ไขได้ด้วย: if (! console.debug) {console.debug = function (args) {console.log (args); }}
Rovanion

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
เอกสารสำหรับ chrome: developers.google.com/chrome-developer-tools/docs/console
mrzmyr

10
นี่คือคำตอบที่ถูกต้อง คำว่า "ผิดพลาด" ไม่ได้กล่าวถึงในคำตอบที่เลือกแม้ว่าจะอยู่ในชื่อคำถาม
Ivan Durst

3
ความพิเศษอีกเล็กน้อยเกี่ยวกับการเพิ่ม CSS คือความสนุก +1!
sudo ทำการติดตั้ง

@ORMapper สิ่งที่ไม่ทำงานมีอะไรบ้าง CSS ฉันคิดว่า?
นิโคลัส

2
ช่วงเวลาที่คุณตระหนักว่าทุกปีที่ใช้งานconsole.logคุณสามารถใช้ CSS ภายในคอนโซล: |
Red

86

ข้อยกเว้นเข้าสู่คอนโซล JavaScript คุณสามารถใช้สิ่งนั้นได้หากคุณต้องการปิดการใช้งานFirebug

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

การใช้งาน:

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

8
ในบางเบราว์เซอร์หากคุณเปิดใช้งานการดีบักสิ่งนี้จะส่งข้อความป๊อปอัป
BrainSlugs83

คุณช่วยอธิบายได้ไหมว่าทำไมthrowต้องห่อด้วยsetTimeout?
แอนโทนี

55

วิธีที่ดีวิธีหนึ่งในการทำงานข้ามเบราว์เซอร์นั้นได้อธิบายไว้ในDebugging JavaScript: ทิ้งการแจ้งเตือนของคุณ! .


7
Throw () เป็นคำแนะนำที่ดี - ควรเป็นคำตอบที่เลือก
matt lohkamp

17
เห็นด้วยนี่เป็นวิธีการข้ามเบราว์เซอร์ แต่ .. การขว้างข้อยกเว้นนั้นแตกต่างจากการบันทึกข้อความหรือไม่?
Robin Maben

14
ในทางกลับกันการโยนข้อยกเว้นจะหยุดการดำเนินการของ "เธรด" ปัจจุบัน (ตามที่ระบุไว้โดย Yuval A) และดำเนินการต่อในการจับถ้ามี ฉันสงสัยว่านี่คือสิ่งที่ต้องการ
dlaliberte

7
throw()ไม่ใช่วิธีการทำเช่นนี้อย่างแน่นอน คุณจะมีปัญหาไม่ช้าก็เร็ว สำหรับฉันมันไม่ช้าก็เร็ว :(
Hugo Mota

4
@Ian_Oxley: มันลงไปในบางจุดตอนนี้มันก็สำรองแล้ว แต่การโพสต์โค้ดที่นี่ยังดีกว่าและแนะนำโดยแนวทางปฏิบัติที่ดีที่สุดของ stackoverflow
woohoo

15

ต่อไปนี้เป็นวิธีแก้ปัญหาสำหรับตัวอักษรเกี่ยวกับวิธีพิมพ์ข้อความไปยังคอนโซลข้อผิดพลาดของเบราว์เซอร์ไม่ใช่คอนโซลดีบักเกอร์ (อาจมีเหตุผลที่ดีที่จะเลี่ยงผ่านตัวดีบัก)

ดังที่ฉันได้กล่าวไว้ในความคิดเห็นเกี่ยวกับข้อเสนอแนะในการโยนข้อผิดพลาดเพื่อให้ได้รับข้อความในคอนโซลข้อผิดพลาดปัญหาอย่างหนึ่งคือการที่จะขัดจังหวะการทำงานของเธรด หากคุณไม่ต้องการขัดจังหวะเธรดคุณสามารถโยนข้อผิดพลาดในเธรดแยกต่างหากเธรดที่สร้างขึ้นโดยใช้ setTimeout ดังนั้นทางออกของฉัน (ซึ่งกลายเป็นความละเอียดของหนึ่งโดย Ivo Danihelka):

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

ฉันรวมเวลาเป็นมิลลิวินาทีนับตั้งแต่เวลาเริ่มต้นเนื่องจากการหมดเวลาอาจบิดเบือนคำสั่งที่คุณคาดว่าจะเห็นข้อความ

อาร์กิวเมนต์ที่สองของเมธอด Error เป็นชื่อไฟล์ซึ่งเป็นสตริงว่างที่นี่เพื่อป้องกันเอาต์พุตของชื่อไฟล์และหมายเลขบรรทัดที่ไม่มีประโยชน์ มันเป็นไปได้ที่จะได้รับฟังก์ชั่นการโทร แต่ไม่ได้อยู่ในเบราว์เซอร์ที่เรียบง่ายอย่างอิสระ

มันจะดีถ้าเราสามารถแสดงข้อความที่มีคำเตือนหรือไอคอนข้อความแทนไอคอนข้อผิดพลาด แต่ฉันไม่สามารถหาวิธีที่จะทำ

ปัญหาอีกประการหนึ่งของการใช้การขว้างก็คือมันอาจถูกจับและถูกโยนทิ้งโดยการลองจับและการโยนในการแยกด้ายเพื่อหลีกเลี่ยงอุปสรรคนั้นเช่นกัน อย่างไรก็ตามยังมีอีกวิธีหนึ่งที่ข้อผิดพลาดอาจถูกจับได้ซึ่งก็คือถ้าตัวจัดการหน้าต่าง window.error ถูกแทนที่ด้วยอันที่ทำสิ่งที่แตกต่าง ไม่สามารถช่วยคุณได้


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

สิ่งนี้น่าสนใจ เราไม่ควรใช้สิ่งนี้ในตอนนั้น ขอบคุณสำหรับข้อมูล Lucas
Yster

2
MDNเห็นว่าconsole.log(...)"ไม่ได้มาตรฐาน" เช่นกัน ในเรื่องที่เป็นมีเสถียรภาพconsole.error console.log
Mike Rapadas

1
@Lucas ใครสนใจถ้าเป็นมาตรฐานล่ะ ใครจะใช้การบันทึกคอนโซลสำหรับการผลิต
Andrew

Console.error ทำงานได้แล้วในเบราว์เซอร์หลักทั้งหมด แม้แต่ IE8 ดูdeveloper.mozilla.org/en-US/docs/Web/API/Console/error
Red


6

WebKit Web ตรวจสอบนอกจากนี้ยังสนับสนุนFirebug ของคอนโซล API (เพียงเล็กน้อยนอกจากนี้เพื่อตอบแดน )


WebKit ดีมาก ๆ ดังนั้นจึงได้รับการสนับสนุนอย่างกว้างขวางมาก ที่ดี!
อัลบัสดัมเบิลดอร์

5

หมายเหตุเกี่ยวกับ 'Throw ()' ที่กล่าวถึงข้างต้น ดูเหมือนว่าจะหยุดการทำงานของหน้าเว็บอย่างสมบูรณ์ (ฉันตรวจสอบใน IE8) ดังนั้นจึงไม่มีประโยชน์มากสำหรับการบันทึก "ในกระบวนการที่กำลังดำเนินการ" (เช่นการติดตามตัวแปรบางอย่าง ... )

คำแนะนำของฉันอาจจะเพิ่มองค์ประกอบtextareaบางแห่งในเอกสารของคุณและเปลี่ยน (หรือผนวกกับ) ค่าของมัน(ซึ่งจะเปลี่ยนข้อความ) สำหรับการบันทึกข้อมูลทุกครั้งที่ต้องการ ...


ฉันเดาว่าเป็นเพราะคุณไม่ได้ตอบคำถามของ OP หากต้องการพิมพ์ไปยังคอนโซล JS คุณต้องใช้วิธีการในตัวเช่นconsole.log()และthrow()อื่น ๆ นอกจากนี้ไม่มีอะไรผิดปกติกับพฤติกรรมของthrow()ตามที่คุณดูเหมือนจะบอกเป็นนัย - ความจริงที่ว่ามันหยุดการดำเนินการเป็นเจตนาและเอกสาร ( นักพัฒนา mozilla.org/en-US/docs/Web/JavaScript/Reference/ ...... ) และสอดคล้องกับวิธีการโยน / จับข้อยกเว้นในภาษาการเขียนโปรแกรมอื่น ๆ (ถ้าคุณต้องการบันทึกเนื้อหาของตัวแปรโดยไม่หยุดการทำงานนั่นเป็นสิ่งที่console.log()จำเป็น)
Sean the Bean

@SantantheBean เดิมมีการอภิปรายเกี่ยวกับความจริงที่ว่า IE ไม่สนับสนุนconsole.logดังนั้นผู้คนจึงให้ทางเลือกอื่น เกี่ยวกับthrow()การหยุดการทำงานแน่นอนว่ามันเป็นเรื่องที่ตั้งใจไม่มีใครพูดว่าไม่ใช่ นั่นเป็นเหตุผลที่ปกติแล้วมันไม่ใช่วิธีที่ดีในการบันทึกข้อมูลการดีบักในรันไทม์ซึ่งสิ่งที่ OP ต้องการ ...
Yuval A.

5

และเช่นเคย Internet Explorer เป็นช้างขนาดใหญ่ใน rollerskates 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 แต่จะไม่มีประสิทธิภาพในการตรวจสอบว่ามี 'คอนโซล' และ 'โอเปร่า' วัตถุอยู่ก่อนที่จะรับข้อยกเว้นหรือไม่
Danubian Sailor

@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

สิ่งนี้ไม่ได้พิมพ์ไปยังคอนโซล แต่จะเปิดป๊อปอัพการแจ้งเตือนพร้อมข้อความซึ่งอาจมีประโยชน์สำหรับการแก้ไขข้อบกพร่องบางอย่าง:

แค่ทำ:

alert("message");

ไม่มีอะไรเหมือนกันกับสิ่งที่ OP ถาม
Zefir Zdravkov

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.