前端捕获异常技巧总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前端捕获异常技巧总结相关的知识,希望对你有一定的参考价值。

参考技术A 异常分类

捕获异常技巧
1.可疑区域增加 try...catch(只能捕获到同步的运行时错误,对于语法和异步错误无能为力,捕获不到。)

2.全局监控JS异常: window.onerror(不是万能的,只有在返回 true 的时候,异常才不会向上抛出(浏览器接收后报红),否则即使是知道异常的发生控制台还是会显示 Uncaught Error: xxxxx,最好写在所有JS脚本的前面,否则有可能捕获不到错误,无法捕获语法错误)

3.全局监控静态资源异常: window.addEventListener

4.全局捕获没有 catch 的 promise 异常:unhandledrejection

5.iframe 异常:window.onerror

6.VUE errorHandler 和 React componentDidCatch

7.监控网页崩溃:window 对象的 load 和 beforeunload

8.Script Error跨域 crossOrigin 解决(跨源资源共享机制( CORS ):我们为 script 标签添加 crossOrigin 属性)

前端异常捕获

前端异常捕获方法:

try…catch…

try{
	const  a = 1;
	   	   c = a+b
}catch(error){
	console.error(error)//打印异常 ReferenceError: b is not defined
}

//使用try catch能够很好的捕获异常并对应进行相应处理,不至于让页面挂掉,但是其存在一些弊端,比如需要在捕获异常的代码上进行包裹,会导致页面臃肿不堪,不适用于整个项目的异常捕获。

window.onerror()

相较于try…catch… , window.onerror ()能全局异常捕获,但无法捕获跨域资源出现的异常和webpack打包压缩文件时生成的source-map
window.onerror = (errorMessage, scriptURI, lineNo, columnNo, error) => {
    console.error('errorMessage: ' + errorMessage); // 异常信息
    console.warring('scriptURI: ' + scriptURI); // 异常文件路径
    console.warring('lineNo: ' + lineNo); // 异常行号
    console.warring('columnNo: ' + columnNo); // 异常列号
    console.error('error: ' + error); // 异常堆栈信息
};

vue.config.errorHandler

vue中封装的异常捕获方法
Vue.config.errorHandler = function (err, vm, info) {
    let { 
        message, // 异常信息
        name, // 异常名称
        script,  // 异常脚本url
        line,  // 异常行号
        column,  // 异常列号
        stack  // 异常堆栈信息
    } = err;

    // vm为抛出异常的 Vue 实例
    // info为 Vue 特定的错误信息,比如错误所在的生命周期钩子
}
从 2.2.0 起,这个钩子也会捕获组件生命周期钩子里的错误。同样的,当这个钩子是 undefined 时,被捕获的错误会通过 console.error 输出而避免应用崩溃。
从 2.4.0 起,这个钩子也会捕获 Vue 自定义事件处理函数内部的错误了。
从 2.6.0 起,这个钩子也会捕获 v-on DOM 监听器内部抛出的错误。另外,如果任何被覆盖的钩子或处理函数返回一个 Promise 链 (例如 async 函数),则来自其 Promise 链的错误也会被处理。

#####错误追踪服务 SentryBugsnag 都通过此选项提供了官方支持。

参考:errorHandler

Error Boundary:

react中的异常捕获方法
class ErrorBoundary extends React.Component {
    constructor(props) {
        super(props);
        this.state = { hasError: false };
    }

    componentDidCatch(error, info) {
        this.setState({ hasError: true });

        // 将异常信息上报给服务器
        logErrorToMyService(error, info); 
    }

    render() {
        if (this.state.hasError) {
            return '出错了';
        }

        return this.props.children;
    }
}
使用
<ErrorBoundary>
    <MyWidget  />
</ErrorBoundary>
参考:Error Boundary

以上是关于前端捕获异常技巧总结的主要内容,如果未能解决你的问题,请参考以下文章

前端异常类型及捕获方式

前端异常捕获

JS的艺术,前端异常捕获技术大全。

前端开发中的Error以及异常捕获

前端开发中的Error以及异常捕获

JQuery $.ajax 捕获异常信息