JavaScript-错误处理
Error
错误分两种:
程序逻辑写得不对,代码执行异常
执行过程中,程序可能遇到无法预测得异常情况而报错,例如网络连接中断,读取不存在的文件,没有操作权限等
对于这种错误,我们需要处理它,并可能需要反馈给用户
对于C这种贴合系统底层的语言,错误是通过错误码
返回的.
但是错误码在写代码时很不方便,所以高级语言使用更抽象的错误处理逻辑.
try…catch…finally
1 |
|
输出如下:
1 |
|
分析下try...catch...finally
的执行顺序:
- 先执行
try{...}
的代码 - 如果出错
- 后续语句不再执行,直接跳转到
catch{...}
执行里面的代码
- 后续语句不再执行,直接跳转到
- 如果没有出错
catch{...}
则不会被执行
- 最后执行
finally{...}
代码
另外catch{...}
和finally{...}
可以都不出现
错误类型
Error
: JS标准的错误对象,从它派生出来的有TypeError
ReferenceError
- …
这些错误对象都可以通过catch(e)
捕获到e
变量中.
1 |
|
当然,e
的命名没有固定,你可以随便.
抛出错误
程序可以主动抛出错误,让执行流程直接跳转到catch
块,使用throw
语句抛出.
1 |
|
实际上,JS允许抛出任意对象,比如数字,字符串.不过最好还是抛出一个Error
.
最后,catch
中一定要写错误处理语句,哪怕只是把错误打印出来,也不要什么都不干.
另外处理错误时,不要简单粗暴地用alert
显示给用户.
错误传播
当一个函数内部发生了错误,它自身没有捕获,错误就被抛到外层调用函数,如果外层调用函数也没有捕获,该错误会一直沿着函数调用链向上抛出,直到被JS引擎捕获,代码终止.
所以我们不必在每一个函数内部捕获错误,只需要在合适的地方统一捕捉.
至于在哪些地方捕捉错误更适合,需要视情况而定.
异步错误处理
1 |
|
上面的代码会先打印done
,一秒后才会打印It is time!
.
此时如果使用try
包裹setTimeout
,而错误发生在printTime
函数内部,try...catch
是无法捕获到对应的错误的.
原因在于:
- 调用
setTimeout()
时,传入的printTime
函数不会马上执行. - JS引擎会先执行
console.log('done');
,此时并没有错误产生 - 一秒钟后再调用
printTime()
,但printTime()
内部和外部都没有捕获错误的代码.
类似的,当我们处理一个事件时,在绑定事件的代码处,无法捕获处理函数的错误.
1 |
|
1 |
|
JavaScript-错误处理
http://example.com/2024/11/20/js-error/