加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 移动互联 > 评测 > 正文

一文告诉你如何优雅处理前端异常?

发布时间:2019-03-18 16:33:24 所属栏目:评测 来源:佚名
导读:前端一直是距离用户最近的一层,随着产品的日益完善,我们会更加注重用户体验,而前端异常却如鲠在喉,甚是烦人。 一、为什么要处理异常? 异常是不可控的,会影响最终的呈现结果,但是我们有充分的理由去做这样的事情。 1.增强用户体验; 2.远程定位问题

对于 iframe 的异常捕获,我们还得借力 window.onerror

  1. window.onerror = function(message, source, lineno, colno, error) { 
  2. console.log('捕获到异常:',{message, source, lineno, colno, error}); 

一个简单的例子可能如下:

  1.   
  2. <iframe src="./iframe.html" frameborder="0"></iframe> 
  3. <script> 
  4. window.frames[0].onerror = function (message, source, lineno, colno, error) { 
  5. console.log('捕获到 iframe 异常:',{message, source, lineno, colno, error}); 
  6. return true; 
  7. }; 
  8. </script> 
  9. 十、Script error 

一般情况,如果出现 Script error 这样的错误,基本上可以确定是出现了跨域问题。这时候,是不会有其他太多辅助信息的,但是解决思路无非如下:

跨源资源共享机制( CORS ):我们为 script 标签添加 crossOrigin 属性。

  1. <script src="http://jartto.wang/main.js" crossorigin></script>

或者动态去添加 js 脚本:

  1. const script = document.createElement('script'); 
  2. script.crossOrigin = 'anonymous'; 
  3. script.src = url; 
  4. document.body.appendChild(script); 

特别注意,服务器端需要设置:Access-Control-Allow-Origin

此外,我们也可以试试这个-解决 Script Error 的另类思路:

  1. const originAddEventListener = EventTarget.prototype.addEventListener; 
  2. EventTarget.prototype.addEventListener = function (type, listener, options) { 
  3. const wrappedListener = function (...args) { 
  4. try { 
  5. return listener.apply(this, args); 
  6. catch (err) { 
  7. throw err; 
  8. return originAddEventListener.call(this, type, wrappedListener, options); 

简单解释一下:

  • 改写了 EventTarget 的 addEventListener 方法;
  • 对传入的 listener 进行包装,返回包装过的 listener,对其执行进行 try-catch
  • 浏览器不会对 try-catch 起来的异常进行跨域拦截,所以 catch 到的时候,是有堆栈信息的;
  • 重新 throw 出来异常的时候,执行的是同域代码,所以 window.onerror 捕获的时候不会丢失堆栈信息;

利用包装 addEventListener,我们还可以达到「扩展堆栈」的效果:

  1. (() => { 
  2. const originAddEventListener = EventTarget.prototype.addEventListener; 
  3. EventTarget.prototype.addEventListener = function (type, listener, options) { 
  4. + // 捕获添加事件时的堆栈 
  5. + const addStack = new Error(`Event (${type})`).stack; 
  6. const wrappedListener = function (...args) { 
  7. try { 
  8. return listener.apply(this, args); 
  9. catch (err) { 
  10. + // 异常发生时,扩展堆栈 
  11. + err.stack += 'n' + addStack; 
  12. throw err; 
  13. return originAddEventListener.call(this, type, wrappedListener, options); 
  14. })(); 

十一、崩溃和卡顿

卡顿也就是网页暂时响应比较慢, JS 可能无法及时执行。但崩溃就不一样了,网页都崩溃了,JS都不运行了,还有什么办法可以监控网页的崩溃,并将网页崩溃上报呢?

崩溃和卡顿也是不可忽视的,也许会导致你的用户流失。

(编辑:晋中站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读