监听和劫持 JavaScript 中的各种错误事件

要监听和劫持 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);

触发不同类型的错误,以验证监听和劫持机制是否正常工作。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值