Bắt tất cả các ngoại lệ không xử lý javascript


112

Tôi đang cố gắng tìm hoặc tìm ra cách hiển thị trong hộp cảnh báo tất cả các ngoại lệ javascript chưa được xử lý trong một ứng dụng. Tôi muốn tất cả những điều này được thực hiện ở phía máy khách, mà không cần sử dụng bất kỳ mã phía máy chủ nào. Tôi đang sử dụng MVC3 làm môi trường.

Tôi đã nghiên cứu trong vài ngày qua và không tìm thấy chính xác những gì tôi đang tìm kiếm.

Tôi đã tìm thấy 2 cách bên dưới có vẻ như chúng gần như là những gì tôi đang tìm kiếm, ngoại trừ những cách này được thiết lập để bạn phải chuyển tên hàm vào một phương thức tùy chỉnh để in dấu vết ngăn xếp của tất cả các ngoại lệ không được xử lý trong đó Chức năng cụ thể. Tôi đang tìm cách để không phải chuyển tên hàm đến một phương thức tùy chỉnh theo cách thủ công để in dấu vết ngăn xếp của tất cả các ngoại lệ không được xử lý. Tôi muốn phương thức tùy chỉnh này chỉ 'lắng nghe' tất cả các ngoại lệ không được xử lý trong toàn bộ ứng dụng.

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

Cũng tương tự như liên kết trước đó:

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

Đây là mã cơ bản từ liên kết thứ 2 ở trên để in dấu vết ngăn xếp của một hàm javascript được chỉ định:

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;
}

Vì vậy, tóm lại điều này, bạn có biết bất kỳ cách nào để có một số loại 'trình nghe' để lắng nghe tất cả các ngoại lệ không được xử lý javascript và sau đó in chúng ra màn hình trong một hộp cảnh báo không?

Cảm ơn! Jason


một điều ... bạn có muốn sử dụng hộp cảnh báo không?!? bạn có thể sử dụng console.log (ERROR_MESSAGE) để ....
Mathlight

1
Tôi nghĩ rằng câu hỏi này Catch tất cả các lỗi JS sẽ giúp bạn ra
Pilgerstorfer Franz

Bạn có thể nên xem câu hỏi này: stackoverflow.com/questions/205688/…
Đánh dấu

Câu trả lời:


129

Bạn có thể thực hiện việc này bằng cách sử dụng phương thức window.onerror.

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

13
Tốt hơn nhiều so với việc cố gắng gói toàn bộ ứng dụng của tôi trong một khối thử / bắt. :) Cảm ơn!
Anthony

15
Chỉ cần lưu ý: "Lưu ý rằng một số / nhiều sự kiện lỗi không kích hoạt window.onerror, bạn phải lắng nghe chúng một cách cụ thể." - developer.mozilla.org/en-US/docs/Web/API/…
shusson

6
không cần phải bao gồm tên hàm (myErrorHandler) trong mã đó ... chỉ có thể là hàm (errorMsg, url, lineNumber)
JoelFan

18
@JoelFan tốt hơn nên có tên hàm cho mục đích gỡ lỗi. Trình gỡ lỗi sẽ sử dụng tên hàm thay vì hiển thị dưới dạng hàm ẩn danh.
Jerinaw

Điều này thật tuyệt vời và cảm ơn! đang cố gắng gỡ lỗi một tập lệnh phóng to ảnh phức tạp luôn hoạt động tốt 100%, ngoại trừ trên safai di động mà nó ngẫu nhiên bị lỗi và không có cửa sổ "bảng điều khiển" hoặc "nhà phát triển" để xem điều gì đã xảy ra. Chắc chắn rằng tôi có cửa sổ "gỡ lỗi" của riêng mình, tôi có thể bật bằng một nút bí mật, nhưng tôi không có cách nào để nhìn thấy toàn bộ mọi lỗi mà tôi đã không thực hiện 'thử / bắt lại. Sự bổ sung này đã cho tôi thấy CHÍNH XÁC vấn đề nằm ở đâu và giúp tôi không bị rách nhiều tóc hơn! Ước gì tôi có thể bỏ phiếu hai lần!
Randy

48

Bạn có thể sử dụng window.onerrorhoặc (thật tuyệt vời!) Liên kết với sự kiện 'error' đúng cách:

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;
})

Nếu bạn muốn theo dõi lỗi JavaScript, bạn có thể thử Atatus . Tôi làm việc tại Atatus.


7
tại sao bạn lại tuyên bố "return false"?
kumaresan_sd

@kumaresan_sd nó cho phép trình xử lý sự kiện mặc định kích hoạt: developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Jens Bodal

29

Ngoài

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;
})

Bạn cũng có thể bắt tất cả các lỗi được kích hoạt bên trong một lệnh gọi lại lời hứa ( .then()) đang lắng nghe unhandledrejectionsự kiện

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

1
Có cần thiết phải sử dụng cả hai window.onerrorwindow.addEventListener("error"hoặc chỉ sử dụng một trong số chúng là đủ?
Tormod Haugene

2
Bạn có thể sử dụng một trong số chúng. Nếu bạn sử dụng window.addEventListener("error", hãy gửi useCaptureset to trueđể tìm các lỗi phần tử không xuất hiện. developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Javier Perez

1
Cảm ơn bạn!! Sự errorkiện không bắt được lỗi cụ thể của tôi. unhandledrejectioncó nó mặc dù.
joe

throw new Error('tja');không bị bắt trong chrome mới nhất với cách tiếp cận này ...
OZZIE

1
@JavierPerez Tôi đã thử nghiệm bằng cách sử dụng v80 đã khắc phục sự kiện và gặp lỗi ngay sau đó và nó không bị bắt, cũng không bắt được lỗi cú pháp.
OZZIE

1

Kiểm tra http://log4javascript.org nó dựa trên Log4J. Nếu hầu hết mã của bạn được bao bọc trong các câu lệnh try / catch để xử lý các trường hợp ngoại lệ, bạn có thể sử dụng thư viện này làm giao diện chung để gửi đầu ra tới "hộp thoại" hoặc cửa sổ ghi nhật ký luôn sẵn có mà người dùng cuối của bạn có thể thấy. Bạn thậm chí có thể có một nút thực hiện window.print () để in nội dung của hộp thoại ra máy in hoặc PDF. Chúc may mắn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.