/** * @param {String} message 错误信息 * @param {String} source 出错文件 * @param {Number} lineno 行号 * @param {Number} colno 列号 * @param {Object} error Error对象(对象) */ window.onerror = function (message, source, lineno, colno, error) { console.log("捕获到异常:", { message, source, lineno, colno, error }); };
<script> function errorHandler(error) { console.log("捕获到静态资源加载异常", error); } </script> <script src="http://cdn.xxx.com/js/test.js" onerror="errorHandler(this)"></script> <link rel="stylesheet" href="http://cdn.xxx.com/styles/test.css" onerror="errorHandler(this)"> <script> window.addEventListener('error', (error) => { console.log('捕获到异常:', error); }, true) </script> //Promise异常 window.addEventListener("unhandledrejection", function (e) { e.preventDefault(); console.log("捕获到 promise 错误了"); console.log("错误的原因是", e.reason); console.log("Promise 对象是", e.promise); return true; }); Promise.reject("promise error"); new Promise((resolve, reject) => { reject("promise error"); }); new Promise((resolve) => { resolve(); }).then(() => { throw "promise error"; }); //react捕获异常 class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; } componentDidCatch(error, info) { // 展示出错的UI this.setState({ hasError: true }); // 将错误信息上报到日志服务器 logErrorToMyService(error, info); } render() { if (this.state.hasError) { // 可以展示自定义的错误样式 return <h1>Something went wrong.</h1>; } return this.props.children; } } //vue捕获异常 Vue.config.errorHandler = (err, vm, info) => { console.error("通过vue errorHandler捕获的错误"); console.error(err); console.error(vm); console.error(info); }; // 异常一共七大类,处理时需分清是致命错误还是非致命错误。 // 可疑区域增加 try-catch // 全局监控 JS 异常 window.onerror // 全局监控静态资源异常 window.addEventListener // 捕获没有 catch 的 Promise 异常用 unhandledrejection // Vue errorHandler 和 React componentDidCatch // Axios 请求统一异常处理用拦截器 interceptors