ตรวจจับข้อผิดพลาด JavaScript ทั้งหมดและส่งไปยังเซิร์ฟเวอร์


232

ฉันสงสัยว่าใครมีประสบการณ์ในการจัดการข้อผิดพลาด JavaScript ทั่วโลกและส่งพวกเขาจากเบราว์เซอร์ลูกค้าไปยังเซิร์ฟเวอร์

ฉันคิดว่าประเด็นของฉันค่อนข้างชัดเจนฉันต้องการทราบทุกข้อยกเว้นข้อผิดพลาดข้อผิดพลาดในการรวบรวม ฯลฯ ที่เกิดขึ้นในฝั่งไคลเอ็นต์และส่งไปยังเซิร์ฟเวอร์เพื่อรายงาน

ฉันส่วนใหญ่ใช้ MooTools และhead.js(สำหรับฝั่ง JS) และ Django สำหรับฝั่งเซิร์ฟเวอร์


20
ฉันไม่เห็นว่าทำไมคำถามนี้ไม่ชัดเจน
Michael Hilus

3
โหวตสองครั้งเพื่อเปิดคำถามอีกครั้ง แต่ไม่มีโชค ไม่ชัดเจนโดยสิ้นเชิงว่าทำไมคำถามนี้จึงปิดไม่ชัดเจน
มูฮัมหมัด Usman

7
@ andrew-barber - หากผู้ใช้หลายคนพบว่าคำถามนี้มีความเกี่ยวข้องมากพอที่จะทำการโหวตได้บางทีถ้ามันไม่ชัดเจนสำหรับคุณปัญหาอยู่กับคุณหรือไม่?
isapir

5
คำถามนี้ไม่ได้เป็นเพียงที่ชัดเจนยังเป็น underrated :)
โทิโอแมน shipahi

คำตอบ:


16

ฉันเพิ่งทดสอบSentry on production และใช้งานได้ดี (JS และภาษาอื่น ๆ เช่น PHP)

1- มันเป็นโอเพ่นซอร์ส (คุณสามารถติดตั้งบนเซิร์ฟเวอร์ของคุณเอง) 2- คุณสามารถใช้แผนฟรี (รายงาน 100 ฉบับ / วัน)

หรือติดตั้งบนเซิร์ฟเวอร์ของคุณ: github.com/getsentry


โปรดทราบว่าพวกเขามีแผนฟรีไม่ จำกัด สำหรับสถาบันการศึกษา
christianvuerings

8
ดูเหมือนจะไม่เป็นโอเพนซอร์สอีกต่อไปตัวเลือกทั้งหมดได้รับเงินหรือไม่
David Cumps

4
@DavidCumps พวกเขายังคงให้บริการฟรี (ทดลอง) แต่คุณจะได้รับประวัติข้อบกพร่อง 7 วันหรือคุณสามารถติดตั้งบนเซิร์ฟเวอร์ของคุณเองตั้งแต่โอเพ่นซอร์ส ( github.com/getsentry )
Tarek

1
Google เครื่องจัดการแท็กมีผู้ฟังข้อผิดพลาด Javascript ซึ่งอาจคุ้มค่าที่จะเช็คเอาท์โดยเฉพาะอย่างยิ่งถ้าคุณใช้ GA อยู่แล้ว
Adrian Gunawan

คุณควรเช็คเอาต์TrackJSสำหรับสิ่งนี้ เป็นบริการชำระเงิน แต่มีบริบทมากมายเกี่ยวกับวิธีที่ผู้ใช้เข้าสู่สถานการณ์ข้อผิดพลาดในการดีบัก ฉันอยู่ของนักพัฒนาและมีตันคงที่ของข้อบกพร่องกับมัน :)
ทอดด์การ์ดเนอร์

318

ฉันจะตรวจสอบwindow.onerror

ตัวอย่าง:

window.onerror = function(message, url, lineNumber) {  
  //save error and send to server for example.
  return true;
};  

โปรดทราบว่าการส่งคืนค่าจริงจะป้องกันการเริ่มต้นตัวจัดการเริ่มต้นและการคืนค่าเท็จจะทำให้ตัวจัดการเริ่มต้นทำงานได้


9
คุณต้องการกำหนด window.onerror โดยเฉพาะอย่างยิ่งก่อนที่สิ่งอื่นใดจะได้รับการทำงาน ดังนั้นไม่ว่าคุณจะวางไว้ที่ไหนก็ให้ตรวจสอบให้แน่ใจว่ามันรันอยู่ก่อนโค้ด / ไฟล์ js อื่น ๆ ของคุณ
Mike Lewis

17
หมายเหตุ Mozilla แนะนำ: 'โปรดทราบว่าเหตุการณ์ข้อผิดพลาดบางส่วน / จำนวนมากไม่เปิดหน้าต่างคุณต้องรับฟังโดยเฉพาะ'
Adam Naylor

88
ใช่ฉันชอบที่มันบอกว่าบางคน / หลายคนบรรยายมาก - ขอบคุณ Mozilla
Daniel Mendel

5
Mozilla เปิดตัว GlobalEventHandlers.onerror: developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/ …
roland

1
จะเกิดอะไรขึ้นถ้ารหัสที่จัดการกับ window.onerror ตัวเองโยนข้อผิดพลาด มีความเป็นไปได้ของการวนซ้ำไม่สิ้นสุดหรือไม่?
Martin Brown

15

หากเว็บไซต์ของคุณใช้ Google Analytics คุณสามารถทำสิ่งที่ฉันทำ:

window.onerror = function(message, source, lineno, colno, error) {
  if (error) message = error.stack;
  ga('send', 'event', 'window.onerror', message, navigator.userAgent);
}

ความคิดเห็นเล็กน้อยเกี่ยวกับรหัสข้างต้น:

  • สำหรับเบราว์เซอร์สมัยใหม่การติดตามสแต็กเต็มจะถูกบันทึกไว้
  • สำหรับเบราว์เซอร์รุ่นเก่าที่ไม่ได้ติดตามการติดตามสแต็กข้อความแสดงข้อผิดพลาดจะถูกบันทึกแทน (ส่วนใหญ่เป็นเวอร์ชัน iOS รุ่นก่อนหน้าในประสบการณ์ของฉัน)
  • เวอร์ชันของเบราว์เซอร์ของผู้ใช้นั้นถูกบันทึกไว้ด้วยดังนั้นคุณสามารถดูว่าเวอร์ชั่นของ OS / เบราว์เซอร์ใดที่ทำให้เกิดข้อผิดพลาด ที่ช่วยลดความสำคัญของการจัดลำดับความสำคัญและการทดสอบ
  • รหัสนี้ทำงานได้ถ้าคุณใช้ Google Analytics กับ "analytics.js" เช่นนี้ หากคุณใช้ "gtag.js" แทนเช่นนี้คุณต้องปรับแต่งบรรทัดสุดท้ายของฟังก์ชั่น ดูที่นี่สำหรับรายละเอียด

เมื่อมีการวางโค้ดนี่คือวิธีที่คุณดูข้อผิดพลาด Javascript ของผู้ใช้:

  1. ใน Google Analytics คลิกBehaviorส่วนและจากนั้นTop Eventsรายงาน
  2. คุณจะได้รับรายการหมวดหมู่กิจกรรม คลิกwindow.onerrorในรายการ
  3. คุณจะเห็นรายการของการติดตามสแต็ก Javascript และข้อความแสดงข้อผิดพลาด เพิ่มคอลัมน์ลงในรายงานสำหรับเวอร์ชันระบบปฏิบัติการ / เบราว์เซอร์ของผู้ใช้ของคุณโดยคลิกSecondary dimensionปุ่มและป้อนEvent Labelในกล่องข้อความที่ปรากฏขึ้น
  4. รายงานจะมีลักษณะเป็นภาพหน้าจอด้านล่าง
  5. ในการแปลสตริง OS / เบราว์เซอร์เป็นคำอธิบายที่มนุษย์อ่านได้มากขึ้นฉันคัดลอกและวางลงในhttps://developers.whatismybrowser.com/useragents/parse/

ป้อนคำอธิบายรูปภาพที่นี่


3
สิ่งนี้ไม่ได้ดักข้อผิดพลาดทั้งหมดเพียงลองจับบล็อกแม้ว่ามันจะเป็นเรื่องดีที่จะอธิบายและฉันไม่คิดว่าคุณสมควรได้รับ downvotes
Nick Steele

ขอบคุณนิค! ฉันอัปเดตคำตอบของฉันด้วยโค้ดทดสอบการต่อสู้ที่ทำงานได้ดีบนเว็บไซต์ของฉันและจับข้อผิดพลาดทั้งหมดไม่ใช่เฉพาะที่คุณดักจับด้วยลอง ... catch
Martin Omander

2

อย่าพยายามใช้บริการของบุคคลที่สามแทนลองด้วยตัวคุณเอง

ตัวจัดการข้อผิดพลาดสามารถตรวจจับสถานการณ์ด้านล่าง

  1. Uncaught TypeError ไม่สามารถจับภาพได้
  2. Uncaught ReferenceError ไม่สามารถจับภาพได้เช่น: var.click ()
  3. TypeError สามารถบันทึกได้
  4. สามารถบันทึกข้อผิดพลาดทางไวยากรณ์ได้
  5. ReferenceError สามารถบันทึกได้

ในการตรวจจับข้อผิดพลาดของ Javascript:

window.addEventListener('error', function (e) {
  //It Will handle JS errors 
})

ในการจับข้อผิดพลาด AngularJS:

app.config(function ($provide) {
$provide.decorator('$exceptionHandler', function ($delegate) {
   return function (exception, cause) {
       //It will handle AngualarJS errors
      }
   })
})

0

นอกจากนี้บริการhttp://jslogger.comก็สามารถช่วยได้เช่นกัน:

บันทึกข้อผิดพลาดและเหตุการณ์ Javascript ในระบบคลาวด์

จากhttp://jslogger.com/features :

จากนี้ไปคุณสามารถตรวจสอบข้อผิดพลาดทั้งหมดที่ทำให้ประสบการณ์การใช้งานเว็บไซต์ของคุณแย่ลง ข้อผิดพลาด Javascript ทุกข้อจะถูกตรวจจับและนำมาให้คุณสำหรับการดีบักในภายหลัง

การปฏิเสธความรับผิด: ไม่มีส่วนเกี่ยวข้องกับบริการ / บริษัท


1
503 Service ไม่พร้อมใช้งาน
Rax

0

คุณสามารถลองAtatus - เป็นบริการติดตามข้อผิดพลาด JavaScript ใหม่พร้อมกับ Real User Monitoring (RUM) สำหรับเว็บแอปสมัยใหม่

เราไม่เพียง แต่จับข้อผิดพลาด แต่ยังรวมถึงกิจกรรมของผู้ใช้ที่ก่อให้เกิดข้อผิดพลาด สิ่งนี้ให้ขั้นตอนในการทำซ้ำข้อผิดพลาดเมื่อสิ้นสุด

นอกเหนือจากการจับข้อผิดพลาดเรายังจับเวลาในการโหลดหน้าเว็บและแสดงในมุมมองที่แตกต่างกันเช่น Geo, Browser, Page Drill Down, Histogram ของหน้า, Ajax Monitoring และ Monitoring Monitoring

https://www.atatus.com/

มีเอกสาร: https://www.atatus.com/docs

คำเตือน: ฉันเป็นนักพัฒนาเว็บที่ Atatus


1
ฉันรวม Ataus และกว่าที่ฉันลองใช้บางอย่างเช่น foo.bar = '' ซึ่งทำให้เกิดข้อยกเว้น แต่ฉันไม่เห็นอะไรเลยในแผงควบคุม Atatus
vmachacek

คุณช่วยส่งอีเมลถึงเราได้ไหม
Fizer Khan

5
ปลั๊กไร้ยางอาย โฆษณาควรถูก จำกัด ที่ด้านขวามือ
จะ

0

uncaughtห้องสมุดเป็นสิ่งที่ดีจับภาพทางฟรีข้อผิดพลาด JS ทั้งหมดรวมทั้งปฏิเสธไม่สามารถจัดการได้


-2

คุณอาจต้องการตรวจสอบออกบริการใหม่นี้http://rescuejs.com/https://bugsnag.com/

ให้คุณบันทึกข้อผิดพลาดจาวาสคริปต์ทั้งหมดโดยไม่ต้องเขียนโค้ดฝั่งเซิร์ฟเวอร์ด้วยตัวคุณเอง นอกจากนี้ยังติดตามรุ่นเบราว์เซอร์และอื่น ๆ

ฉันไม่แน่ใจว่าฉันจะพิจารณาพวกเขา 100% "องค์กรพร้อม" แต่มันคุ้มค่าที่จะเช็คเอาท์


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