Improve global error handling resiliency

main
Isaiah Odhner 2022-02-24 21:05:17 -05:00
parent e054b561c0
commit 714696e8c9
2 changed files with 32 additions and 3 deletions

View File

@ -11,13 +11,36 @@ window.onerror = function (message, source, lineno, colno, error) {
show_error_message(localize("Internal application error."), error || message);
} catch (e) {
old_onerror(message, source, lineno, colno, error);
console.warn("Error in error handler:", e);
}
};
window.onunhandledrejection = function (event) {
show_error_message(localize("Internal application error.") + "\nUnhandled Rejection.", event.reason);
};
var old_onunhandledrejection = window.onunhandledrejection;
var restore_new_onunhandledrejection_tid;
var new_onunhandledrejection = function (event) {
// Just in case show_error_message triggers a new unhandledrejection event,
// we need to make sure we don't call it again.
// Test by adding to the top of show_error_message:
// Promise.reject(new Error("EMIT EMIT EMIT"))
// Also test:
// throw new Error("EMIT EMIT EMIT");
// I want my error handling to be RESILIENT!
window.onunhandledrejection = old_onunhandledrejection;
clearTimeout(restore_new_onunhandledrejection_tid);
restore_new_onunhandledrejection_tid = setTimeout(function () {
window.onunhandledrejection = new_onunhandledrejection;
}, 0);
try {
show_error_message(localize("Internal application error.") + "\nUnhandled Rejection.", event.reason);
} catch (e) {
old_onunhandledrejection(event);
console.warn("Error in unhandledrejection handler:", e);
}
};
window.onunhandledrejection = new_onunhandledrejection;
// Show a message for old Internet Explorer.
if (/MSIE \d|Trident.*rv:/.test(navigator.userAgent)) {
document.write(
'<style>body { text-align: center; }</style>' +

View File

@ -1141,6 +1141,12 @@ function please_enter_a_number() {
}
function show_error_message(message, error) {
// Test global error handling resiliency by enabling one or both of these:
// Promise.reject(new Error("EMIT EMIT EMIT"));
// throw new Error("EMIT EMIT EMIT");
// It should fall back to an alert.
// EMIT stands for "Error Message Itself Test".
const { $message } = showMessageBox({
iconID: "error",
message,