要监听和劫持 JavaScript 中的各种错误事件,包括 error 事件、未处理的 Promise 拒绝(unhandledrejection),以及 console.error,可以按以下方式实现:
监听 error 事件:当 JavaScript 运行时环境中出现未捕获的错误时触发。
监听 unhandledrejection 事件:当 Promise 被拒绝但没有处理程序时触发。
劫持 console.error:重写 console.error 方法来捕获并处理所有错误日志。
以下是一个完整的示例代码,展示了如何同时实现这三种监听和劫持机制:
复制代码
// 保存原始的 console.error 方法
const originalConsoleError = console.error;
// 重写 console.error 方法
console.error = function (...args) {
// 自定义操作
customErrorHandler('console.error', args);
// 调用原始的 console.error 方法
originalConsoleError.apply(console, args);
};
// 监听 window.onerror 事件
window.addEventListener('error', function (event) {
// 自定义操作
customErrorHandler('error', event.message, event.filename, event.lineno, event.colno, event.error);
});
// 监听 unhandledrejection 事件
window.addEventListener('unhandledrejection', function (event) {
// 自定义操作
customErrorHandler('unhandledrejection', event.reason);
});
// 自定义错误处理函数
function customErrorHandler(type, ...args) {
console.log(`[Custom Handler] ${type}:`, ...args);
// 你可以在这里执行任意操作,比如发送错误信息到服务器
// fetch('/log-error', {
// method: 'POST',
// headers: {
// 'Content-Type': 'application/json'
// },
// body: JSON.stringify({ type, args })
// });
}
// 测试 console.error 劫持
console.error('This is a test error message.');
// 测试未捕获的错误
setTimeout(() => {
throw new Error('This is a test uncaught error.');
}, 1000);
// 测试未处理的 Promise 拒绝
setTimeout(() => {
Promise.reject('This is a test unhandled rejection.');
}, 2000);
保存和重写 console.error 方法:
const originalConsoleError = console.error;
console.error = function (...args) {
customErrorHandler('console.error', args);
originalConsoleError.apply(console, args);
};
重写 console.error 方法,捕获所有错误日志,并调用自定义错误处理函数。
监听 error 事件:
window.addEventListener('error', function (event) {
customErrorHandler('error', event.message, event.filename, event.lineno, event.colno, event.error);
});
当出现未捕获的错误时,触发 error 事件,并调用自定义错误处理函数。
监听 unhandledrejection 事件:
window.addEventListener('unhandledrejection', function (event) {
customErrorHandler('unhandledrejection', event.reason);
});
当出现未处理的 Promise 拒绝时,触发 unhandledrejection 事件,并调用自定义错误处理函数。
自定义错误处理函数:
function customErrorHandler(type, ...args) {
console.log(`[Custom Handler] ${type}:`, ...args);
// 你可以在这里执行任意操作
}
定义一个通用的错误处理函数,可以记录日志或执行其他操作。
测试代码:
console.error('This is a test error message.');
setTimeout(() => {
throw new Error('This is a test uncaught error.');
}, 1000);
setTimeout(() => {
Promise.reject('This is a test unhandled rejection.');
}, 2000);
触发不同类型的错误,以验证监听和劫持机制是否正常工作。