当前位置: 首页 > news >正文

javaScript 错误处理与调试

《JavaScript高级程序设计》读书笔记

错误处理

try {
  // 可能出错的代码
} catch(error) {
  // 出错时要做什么
  console.log(error.meesage)
} finally {
  // 始终执行
}

错误类型

  • Error:基类型,其他错误类型继承该类型
  • InternalError(非标准):底层Javascript 引擎抛出异常时
  • EvalError:使用eval() 函数发生异常时
  • RangeError:数值越界
  • ReferenceError:找不到对象
  • SyntaxError:给eval() 传入字符串包含JavaScript语法错误时
  • TypeError:变量不是预期类型,或者访问不存在的方法
  • URIError:使用encodeURI() 或decodeURI() 传入了格式错误的URI

抛出错误

throw 操作符,用于任何时候抛出自定义错误,代码立即停止执行。

throw 1243;
throw "hello"
throw new error("a error");
throw new URIError("Uri, is that you?");
throw new ReferenceError("You didn't cite your references properly.");

创建自定义错误类型:需要提供name属性和message 属性:

class CurstomError extends Error {
  constructor(message){
    super(message);
    this.name = "CurstomError";
    this.message = message;
  }
}
throw new CurstomError("my message")

error 事件

任何没有被 try/catch 语句处理的错误都会在 window 对象上触发 error 事件。传入 3 个参数:错误消息、发生错误的 URL 和行号。

图片也支持 error 事件。如果图片 src 属性中的 URL 没有返回可识别的图片格式,就会触发 error 事件。

window.onerror = (message, url, line) => {
    console.log(message);
    // 返回false 阻止浏览器默认报告错误的行为
    return false;
};

const image = new Image();
image.addEventListener("error", (event) => {
    console.log("Image not loaded!");
});
image.src = "doesnotexist.gif"; // 不存在,资源会加载失败

识别错误

  • 类型转换错误:使用了会自动改变某个值的数据类型的操作符或语言构造
  • 数据类型错误:发生在将意外值传给函数的时候
  • 通信错误:把数据发送到服务器之前没有用encodeURIComponent()编码,会导致这种错误

区分重大与非重大错误

非重大错误:

  • 不会影响用户的主要任务;
  • 只会影响页面中某个部分;
  • 可以恢复;
  • 重复操作可能成功。

重大错误特性:

  • 应用程序绝对无法继续运行;
  • 错误严重影响了用户的主要目标;
  • 会导致其他错误发生。
for (let mod of mods){
  mod.init(); // 可能的重大错误
}
// 优化后
for (let mod of mods){
  try {
    mod.init();
  } catch (ex){
    // 在这里处理错误
  }
}

把错误记录到服务器中

Web 应用程序开发中的一个常见做法是建立中心化的错误日志存储和跟踪系统。数据库和服务器错误正常写到日志中并按照常用 API 加以分类。

要建立 JavaScript 错误日志系统,首先需要在服务器上有页面或入口可以处理错误数据。该页面只要从查询字符串中取得错误数据,然后把它们保存日志中到错误即可。比如,该页面可以使用如下代码:

function logError(sev, msg) {
  let img = new Image(),
  encodedSev = encodeURIComponent(sev),
  encodedMsg = encodeURIComponent(msg);
  img.src = 'log.php?sev=${encodedSev}&msg=${encodedMsg}';
}

logError()函数接收两个参数:严重程度和错误消息。这里使用 Image 对象发送请求主要是从灵活性方面考虑的。

  • 所有浏览器都支持 Image 对象,即使不支持 XMLHttpRequest 对象也一样。
  • 不受跨域规则限制。通常,接收错误消息的应该是多个服务器中的一个,而 XMLHttpRequest此时就比较麻烦。
  • 记录错误的过程很少出错。大多数 Ajax 通信借助 JavaScript 库的包装来处理。如果这个库本身出错,而你又要利用它记录错误,那么显然错误消息永远不会发给服务器。

相关文章:

  • springboot部署到服务器提示no main manifest attribute, in xx.jar
  • Nginx:优化和防盗链
  • 前端uniapp存储对象到本地app端获取不到问题
  • 【C++提高】函数模板基础使用
  • Dubbo 查看服务
  • 论文通过学校的查重率是多少?
  • BIM培训避坑指南,我先帮各位盘一盘
  • 如何用手机备忘录扫描图片文件并保存到相册
  • Node.js学习(二)
  • 数仓建模—用户旅程地图
  • 栈在求值表达式中的应用
  • 二战MySQL数据库【升华篇】
  • 对话情绪识别易语言代码
  • apple相关新闻查询易语言代码
  • 基于微信小程序和安卓的图书销售商城
  • 30秒的PHP代码片段(1)数组 - Array
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • ES6语法详解(一)
  • github从入门到放弃(1)
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • python3 使用 asyncio 代替线程
  • Python连接Oracle
  • React-redux的原理以及使用
  • 机器学习 vs. 深度学习
  • 讲清楚之javascript作用域
  • 跨域
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 携程小程序初体验
  • linux 淘宝开源监控工具tsar
  • 阿里云ACE认证之理解CDN技术
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​flutter 代码混淆
  • ​马来语翻译中文去哪比较好?
  • #pragma 指令
  • (175)FPGA门控时钟技术
  • (3)(3.5) 遥测无线电区域条例
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (一)RocketMQ初步认识
  • (一一四)第九章编程练习
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)创业的注意事项
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .Net 8.0 新的变化
  • .NET委托:一个关于C#的睡前故事
  • /proc/stat文件详解(翻译)
  • @RestControllerAdvice异常统一处理类失效原因
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [20180129]bash显示path环境变量.txt
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计
  • [C/C++] C/C++中数字与字符串之间的转换