js错误捕获的正确姿势

五迷三道 提交于 2021-01-17 08:58:48

  最近在技术交流群里看到有人问道网络错误怎么捕获,没网或网络不佳服务器联络中断,这时候的异常应该怎么捕获?

  正好最近也遇到了错误捕获的问题,自己研究了一下,也做了一些做了一些总结,和大家分享一下。当网络不佳或链接超时就会出现类似的报错的

由于服务器没有返回状态码,所以导致错误用状态码判断捕获不到。因为网络错误发出的请求会抛出一个错误,打印出来一看,呀,原来是这样怎么捕获呢,同样遇到这样的问题,然后查了一些资料,原来可以通过 error.message 直接捕获到错误,error是一个错误对象,message 在其原型上。error.message 不仅可以捕获请求时发生的错误,由于js语法不严谨造成的错误也可以捕获到。error 的原型有 

  • Error.prototype.constructor

  • 实例原型的构造函数。

  • Error.prototype.message

  • 错误信息。(只有此属性的浏览器兼容性最好)

  • Error.prototype.name

  • 错误名。

  • Error.prototype.fileName

  • 产生该错误的文件名。

  • Error.prototype.lineNumber

  • 产生该错误的行号。

  • Error.prototype.columnNumber

  • 产生该错误的列号。

  • Error.prototype.stack

  • 错误堆栈。

error 的类型有: 

·  EvalError    此异常不再会被JavaScript抛出

·  InternalError  表示出现在JavaScript引擎内部的错误

·  RangeError  标明一个错误,当一个值不在其所允许的范围或者集合中

·  ReferenceError  代表当一个不存在的变量被引用时发生的错误

·  SyntaxError  代表尝试解析语法上不合法的代码的错误

·  TypeError   用来表示值的类型非预期类型时发生的错误

·  URIError 用来表示以一种错误的方式使用全局URI处理函数而产生的错误

以上所有的类型均继承自 Error因此都具有 Error有的属性,不同浏览器可能会有不同的属性。

小程序的网络错误又是另外一种捕获方式,腾讯做了统一处理,小程序只要后台能返回数据的状态码都是200,所以当地址错误或网络错误时会进入到 fail回调里,但回调参数是个对象,取值只能用 error.errMsg来取值。为了方便统一做了统一封装转换,供大家参考。


 1function request(url, data = {}, method = "GET"{
2  return new Promise(function (resolve, reject{
3    if (/[a-z]/g.test(method)) {
4      method = method.toUpperCase()
5    }
6    wx.showNavigationBarLoading()
7    wx.request({
8      url: url,
9      data: data,
10      method: method,
11      header: {'Content-Type': method === 'GET' ? 'application/json' : 'application/x-www-form-urlencoded'},
12      successfunction (res{
13        if (res.statusCode == 200) {
14          resolve(res.data)
15          /*if (res.data) {
16            if (res.data.code == 0) {
17              resolve(res.data);
18            } else {
19              throwError(res.data, reject)
20            }
21          } else {
22            throwError(res, reject)
23          }*/

24        } else {
25          reject({
26            message'网络错误,请稍后重试',
27            code: res.statusCode
28          })
29        }
30      },
31      failfunction (err{
32        if (err.errMsg && !err.message) {
33          err.message = err.errMsg
34        }
35        reject(err)
36        console.log('request failed')
37      },
38      complete() {
39        wx.hideNavigationBarLoading()
40      }
41    })
42  })
43}


以上仅作为笔记记录,后续会继续完善。

本文分享自微信公众号 - web 开发学习(web_learn3)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!