จับข้อยกเว้นที่ไม่ได้จัดการกับจาวาสคริปต์ทั้งหมด


113

ฉันกำลังพยายามค้นหาหรือหาวิธีแสดงในกล่องแจ้งเตือนข้อยกเว้นจาวาสคริปต์ที่ไม่ได้จัดการทั้งหมดในแอปพลิเคชัน ฉันต้องการให้ทั้งหมดนี้ทำในฝั่งไคลเอ็นต์โดยไม่ต้องใช้โค้ดฝั่งเซิร์ฟเวอร์ ฉันใช้ MVC3 เป็นสภาพแวดล้อม

ฉันได้ทำการค้นคว้าในช่วงสองสามวันที่ผ่านมาและไม่พบสิ่งที่ฉันต้องการ

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

http://eriwen.com/javascript/js-stack-trace/

สิ่งที่คล้ายกับลิงค์ก่อนหน้านี้:

https://github.com/eriwen/javascript-stacktrace

นี่คือโค้ดพื้นฐานจากลิงค์ที่ 2 ด้านบนที่พิมพ์ stack trace ของฟังก์ชัน javascript ที่ระบุ:

instrumentFunction: function (context, functionName, callback) {
    context = context || window;
    var original = context[functionName];
    context[functionName] = function instrumented() {
        callback.call(this, printStackTrace().slice(4));
        return context[functionName]._instrumented.apply(this, arguments);
    };
    context[functionName]._instrumented = original;
}

function printStackTrace(options) {
    options = options || {
        guess: true
    };
    var ex = options.e || null,
        guess = !! options.guess;
    var p = new printStackTrace.implementation(),
        result = p.run(ex);
    return (guess) ? p.guessAnonymousFunctions(result) : result;
}

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

ขอบคุณ! เจสัน


อย่างหนึ่ง ... คุณจะใช้กล่องแจ้งเตือนหรือไม่!? คุณสามารถใช้ console.log (error_message) เพื่อ ....
Mathlight

1
ฉันคิดว่าคำถามนี้ จับข้อผิดพลาด JS ทั้งหมดจะช่วยคุณได้
Pilgerstorfer Franz

คุณน่าจะลองดูคำถามนี้ stackoverflow.com/questions/205688/…
Mark

คำตอบ:


130

คุณสามารถทำได้โดยใช้เมธอด window.onerror

window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
    alert("Error occured: " + errorMsg);//or any message
    return false;
}

13
ดีกว่าการพยายามรวมแอปทั้งหมดของฉันไว้ในบล็อก try / catch :) ขอบคุณ!
Anthony

15
โปรดทราบว่า: "โปรดทราบว่าเหตุการณ์ข้อผิดพลาดบางอย่าง / หลายเหตุการณ์ไม่ได้เรียกใช้ window.onerror คุณต้องฟังโดยเฉพาะ" - developer.mozilla.org/en-US/docs/Web/API/…
shusson

6
ไม่จำเป็นต้องใส่ชื่อฟังก์ชัน (myErrorHandler) ในรหัสนั้น ... สามารถเป็นฟังก์ชัน (errorMsg, url, lineNumber)
JoelFan

18
@JoelFan ควรมีชื่อฟังก์ชันเพื่อวัตถุประสงค์ในการดีบัก ดีบักเกอร์จะใช้ชื่อฟังก์ชันแทนการแสดงเป็นฟังก์ชันที่ไม่ระบุตัวตน
Jerinaw

ยอดเยี่ยมมากและขอบคุณ! พยายามแก้ไขข้อบกพร่องของสคริปต์การซูมภาพที่ซับซ้อนซึ่งทำงานได้ดี 100% ตลอดเวลายกเว้นบนอุปกรณ์เคลื่อนที่ Safai ที่สุ่มไม่สำเร็จและไม่มีหน้าต่าง "คอนโซล" หรือ "ผู้พัฒนา" เพื่อดูว่าเกิดอะไรขึ้น แน่นอนว่าฉันมีหน้าต่าง "แก้จุดบกพร่อง" ของตัวเองฉันสามารถเปิดด้วยปุ่มลับได้ แต่ฉันไม่มีทางเห็นข้อผิดพลาดทั้งหมดที่ฉันไม่ได้ทำ 'ลอง / จับ' จากทั่วโลก การเพิ่มนี้แสดงให้ฉันเห็นอย่างชัดเจนว่าปัญหาอยู่ที่ใดและช่วยให้ผมขาดหลุดร่วงมากขึ้น หวังว่าฉันจะโหวตได้สองครั้ง!
Randy

48

คุณสามารถใช้window.onerrorหรือ (น่าอัศจรรย์!) เชื่อมโยงกับเหตุการณ์ 'ข้อผิดพลาด' อย่างถูกต้อง:

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

หากคุณต้องการที่จะติดตามข้อผิดพลาด JavaScript คุณสามารถลองAtatus ฉันทำงานที่ Atatus


7
ทำไมคุณถึง "ส่งคืนข้อความเท็จ"
kumaresan_sd

@kumaresan_sd อนุญาตให้ตัวจัดการเหตุการณ์เริ่มต้นเริ่มทำงาน: developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Jens Bodal

29

นอกจาก

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

นอกจากนี้คุณยังสามารถตรวจจับข้อผิดพลาดทั้งหมดที่เกิดขึ้นภายในการเรียกกลับสัญญา ( .then()) เพื่อฟังunhandledrejectionเหตุการณ์

window.addEventListener('unhandledrejection', function (e) {
  alert("Error occurred: " + e.reason.message);
})

1
จำเป็นต้องใช้ทั้งสองอย่างwindow.onerrorและwindow.addEventListener("error"หรือใช้อย่างใดอย่างหนึ่งเพียงพอหรือไม่
Tormod Haugene

2
คุณสามารถใช้หนึ่งในนั้น หากคุณใช้window.addEventListener("error"ให้ส่งuseCaptureset to trueเพื่อตรวจจับข้อผิดพลาดขององค์ประกอบที่ไม่เกิดขึ้น developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Javier Perez

1
ขอบคุณ!! errorเหตุการณ์ก็ไม่ได้จับข้อผิดพลาดโดยเฉพาะอย่างยิ่งของฉัน unhandledrejectionเข้าใจแล้ว
โจ

throw new Error('tja');ไม่ติดอยู่ในโครเมี่ยมล่าสุดด้วยวิธีนี้ ...
OZZIE

1
@JavierPerez ฉันทดสอบโดยใช้ v80 แนบเหตุการณ์และส่งข้อผิดพลาดโดยตรงในภายหลังและไม่ถูกจับไม่พบข้อผิดพลาดทางไวยากรณ์เช่นกัน
OZZIE

1

ตรวจสอบhttp://log4javascript.orgซึ่งขึ้นอยู่กับ Log4J หากโค้ดส่วนใหญ่ของคุณถูกรวมไว้ในคำสั่ง try / catch เพื่อจัดการข้อยกเว้นคุณสามารถใช้ไลบรารีนี้เป็นอินเทอร์เฟซทั่วไปสำหรับการส่งเอาต์พุตไปยัง "กล่องโต้ตอบ" หรือหน้าต่างการบันทึกที่พร้อมใช้งานตลอดเวลาซึ่งผู้ใช้ของคุณสามารถมองเห็นได้ คุณยังสามารถมีปุ่มที่เรียกใช้ window.print () เพื่อพิมพ์เนื้อหาของกล่องโต้ตอบไปยังเครื่องพิมพ์หรือ PDF โชคดี.

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