首页 > 其他分享 >第 十八 篇 错误处理 与 调试

第 十八 篇 错误处理 与 调试

时间:2023-04-05 22:57:31浏览次数:39  
标签:console log 错误 抛出 十八 try catch 错误处理 调试

by caix in 深圳

常见的错误类型

错误类型
Error:基类型,其他错误类型都继承自该类型

EvalError:使用 eval() 函数发生异常时被抛出

RangeError:在数值超出相应范围时触发

ReferenceError:在找不到对象的时候发生该错误(object expected),通常在访问不到变量的时候发生这种错误

SyntaxError:语法错误,当语法错误的 js 字符串传入 eval() 函数时会触发该错误

TypeError:在变量中保存着意外的类型时,或者在访问不存在的方法时,会导致这种错误

URIError:在使用 encodeURI() 或 decodeURI() ,而 URI 格式不正确时,就会导致该错误
确定错误类型的方法
可以在 try-catch 语句的 catch 语句中使用 instanceof 操作符确定错误的类型
new eval();//抛出 evalError
eval = foo;//抛出 evalError

var a = new Array(-20);//抛出 RangeError
var b = new Array(Number.MAX_VALUE);//抛出 RangeError

var obj = x;//在 x 未声明的情况下抛出 ReferenceError

eval("a ++ b");//抛出 SyntaxError

var o = new 10;//抛出 TypeError
alert("name" in true);//抛出 TypeError
Function.prototype.toString.call("name");//抛出 TypeError

try{
    doSomething();
}catch(error){
    if(error instanceof TypeError){
        //处理类型错误
    }else if(error instanceof ReferenceError){
        //处理引用错误
    }else{
        //处理其他类型错误
    }
}

错误处理

1、try...catch

try 块中出错,catch 块中获取错误信息

try {
    console.log(a)
} catch (e) {
    console.log(e)
    console.log(e.name)
    console.log(e.message)
}
2、finally

finally 包含一定要执行的语句

try {
    console.log(a)
} catch (e) {
    console.log(e)
} finally {
    console.log('over')
}
3、throw

抛出一个可以捕获的错误,可指定错误信息和错误类型

throw new Error('一个错误被抛出')

throw '一个错误被抛出'

try {
    throw '一个错误被抛出' 可自定义
} catch (e) {
    console.log(e)  // 接到 throw 捕获的错误
} finally {
    console.log('over')
}
throw 操作符用于随时抛出自定义错误,在遇到 throw 操作符时,代码会立即停止执行,仅当有 try-catch 语句捕获到被抛出的值时,代码才会继续执行
4 try...catch 与 finally 注意点
try...finally 组合使用时,如果 finally 中设置了返回值,此返回值会覆盖 try 中的返回值,没有设置的话就不会覆盖

如果 finally 中抛出异常(无论是有意还是无意),函数就会在此处终止。如果此前 try 中 已经有 return 设置了返回值,则该值会被丢弃

ES5 严格模式

1、ES3.0 存在以下问题

语法严谨和合理性
语法怪异行为
安全性效率

2、ES 3.0 基础上推出严格模式,IE9 及以下不支持严格模式

3、使用严格模式 (可以全局使用严格模式,也可以在单独作用域中使用)

<script type="text/javascript">
    'use strict'

    function test() {
        'use strict'
    }

    var test = (function () {
        'use strict'
    })()
</script>

4、严格模式不能使用 with 方法,语法错误 with 方法用于改变作用域

var obj = {
    a : 1
}

function test() {
    var a = 2
    with (obj) {
      console.log(a)
    }
}
test()

5、严格模式下不能使用 arguments 的callee 和 caller 属性,类型错误

6、严格模式下,不允许不声明直接赋值

   严格模式下报引用错误
   
   a = 1 
   var b = c = 2
   
7、严格模式下函数内部 this 为 undefined

function test() {
    console.log(this)
}
test() // undefined
var t = new test() // {}
test.call(1) // 1

8、严格模式下不允许函数参数重复,报语法错误

9、严格模式拒绝使用重复的对象属性名,但不报错

10、严格模式下 eval 函数问题

eval('var a = 1')
console.log(a) 

 非严格模式下,a 挂在 window 上,打印出 1,
 严格模式下,eval 有自己的作用域,在 window 下打印 a 报引用错误

错误事件

任何没有通过 try-catch 处理的错误都会触发 window 对象的 error 事件。onerror 事件处理程序都不会创建 event 对象,但是可以接收三个参数:错误消息、错误所在的 URL 和行号。可以通过在事件处理程序中返回false,阻止浏览器报告错误的默认行为

window.onerror = function(message, url, line){ 
  	alert(message); 
  	return false; 
}; 

调试技术

https://juejin.cn/post/6844903765489745934

console

   1、console.log(...)
   
   查看console.log(...)打印出的日志应该是目前大多数前端惯用的调试方法。但是这种方式对于缕清程序运行的步骤和过程来说是比较困难的,比如,我要查看一个函数被调用的位置,这就比较难找出
   
   2、console.trace(...)
   
   这个console.trace()的概述是:向Web控制台输出一个堆栈跟踪。意思就是打印当前执行位置到console.trace()的路径信息
   使用console.trace()可以打印出详细的调用堆栈
   
   其他 console.XXX()
   
   3、console.count()
   
   console.count('coffee'); // 复制到控制台执行一次
   
   这个方法是用来打印调用 count 的次数,可以传入一个参数来当做标识
   
   4、console.dir(object)
   
   这个方法用来打印指定对象的JSON形式
   
   5、console.dirxml(object)
   
   这个方法用来打印 node 节点的 xml形式
   
   6、console.error(object [, object, ...])
   
   这个方法用来打印一个错误的信息,并且包含堆栈轨迹(就是错误发生的路径追踪)
   
   7、console.table(array)
   
   将信息打印为一个表格,比如 数组 或 对象
   
   8、console.time() 与 console.timeEnd();
   
   用来开启一个新的定时器,知道调用 console.timeEnd,并将所消耗的时间打印出来
   
    console.time();
    for (var i = 0; i < 100000; i++) {
      let square = i ** 2;
    }
    console.timeEnd();
断点调试

如果是使用webpack打包了需要将打开map模式,否则断点断不到具体文件。

1、浏览器中断点

   我们console.log()打印的时候,后面会出现打印的具体文件位置
   
   点击之后会跳到这个文件的具体位置。之后点击我箭头所指的位置就断点了
   
   之后就可以按F5刷新断点调试了,程序运行到这个地方会被卡住,然后你就可以查看当前的环境中的一些信息
   
   查看调用栈
   
2、代码中的断点 debugger

   在代码中直接使用 debugger 关键字可以快速的实现断点
   
   效果和浏览器中的断点效果是一样的
vscode 调试

在项目根目录配置.vscode文件夹。下有个launch.json文件

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "启动程序",
            "program": "${workspaceFolder}/HT/javascript/test.js"
        }
    ]
}
vue devTools

vue devTools 使用chrome内核的浏览器可以下载vue devTools拓展来调试vue单页应用,这使得vue项目调试起来非常的方面
性能调试工具 performance

使用Chrome DevTools的performance面板可以记录和分析页面在运行时的所有活动

在火焰图上看到的圈起来的三条虚线,分别是:

蓝线代表 DOMContentLoaded 事件
绿线代表首次绘制的时间
红线代表 load 事件

标签:console,log,错误,抛出,十八,try,catch,错误处理,调试
From: https://www.cnblogs.com/caix-1987/p/17291218.html

相关文章

  • 一些常用的Python调试工具
    pdb:Python自带的调试工具,可以在代码中添加断点并逐步执行代码,以便逐步检查代码执行的过程。ipdb:基于pdb的增强版,支持更多的交互式调试功能。PyCharm:一个常用的Python集成开发环境,可以通过图形化界面来调试程序。VisualStudioCode:另一个常用的Python集成开发环境,也可......
  • ROS动态调试PID参数
    ROS动态调试PID参数连接小车注意:必须在同一区域网sshclbrobort@clbrobort激活树莓派主板roslaunchclbrobotbringup.launch打开PID重新打开一个终端输入:sshclbrobot@iprosrunriki_Pidpid_configure打开控制器重新打开终端输入:rosrunrqt_reconfigurerqt_reco......
  • windbg 基本调试
    控制调试目标中断执行按ctrl+c来中断程序执行恢复执行g不带任何参数,只是恢复调试目标的执行,直到下一次发生某个调试事件如果不希望调试器在初始启动时停止程序的执行,在启动调试器时加-g如ntsd-ga.exe单步调试代码pstepp的变种pt会一直执行指令,直到遇见一个Ret指令......
  • 第三十八篇 vue - 最佳实践 - 性能优化
    概述Vue在大多数常见场景下性能都是很优秀的,通常不需要手动优化。然而,总会有一些具有挑战性的场景需要进行针对性的微调。在本节中,我们将讨论用Vue开发的应用在性能方面该注意些什么首先,让我们区分一下web应用性能的两个主要方面1、页面加载性能首次访问时,应......
  • stm32f407探索者开发板(十三)——JLINK在线调试_软件调试_方法与技巧
    文章目录一、JTAG/SWD调试原理1.1调试原理简析二、在实验中讲解调试方法2.1调试之前的配置2.2调试一、JTAG/SWD调试原理1.1调试原理简析STM32F4xx的内核是CortexTM-M4F,该内核包含用于高级调试功能的硬件。利用这些调试功能,可以在取指(指令断点)或取访问数据(数据断点)时停止内......
  • 内核错误调试技巧记录
    printk打印调试include/linux/printk.h头文件externintconsole_printk[];#defineconsole_loglevel(console_printk[0])#definedefault_message_loglevel(console_printk[1])#defineminimum_console_loglevel(console_printk[2])#definedefault_console_loglevel......
  • 使用内网穿透调试微信小程序
    随意购买一个,登陆后台,选择隧道管理下载客户端点击bat批处理文件输入隧道id回车即可进入微信小程序编程工具将这个勾给勾上,然后修改HTTP_REQUEST_URL即可创作不易,如果能够解决您的问题,请给我点个赞,谢谢......
  • windbg调试命令8(bp、bu、bm、bl、bc、ba、be、bd)
    以下以skinhgy为例,windbg附加运行1.bp命令是在某个地址下断点,可以bp0x7783FEB也可以bpMyApp!SomeFunction对于后者,WinDBG会自动找到MyApp!SomeFunction1)当代码修改之后,函数地址改变,该断点仍然保持在相同位置,不一定继续有效; 2)WinDBG不会把bp断点保存工作空间中bp Addre......
  • 测试和调试 容器化Node应用
    TestingandDebuggingaContainerizedNodeapplicationIntroductionContainersingeneralandDockerinspecifichavechangedthewayhowwethinkaboutrunninganddeployingsoftwarequiteabit.Runninganapplicationinacontainerinsteadofdirectl......
  • 性能分析之内核调试工具
    最近给自己定了些任务,把PPT重新编写一下,所有性能相关的话题都在计划的范围里。最近这几天在整理调试工具的培训PPT,本来是在7DGroup的云服务器上做实例的。结果发现有些数据显示不出来。看来现在的调试工具也是需要更新了,还要再出新版支持现在的云主机了。今天下午特地找了个物理机......