错误处理
try catch、
流程
-
执行try内的代码
-
未发生错误,直接结束
-
发生错误,控制流转向catch,执行catch内代码
try catch解决的是runtime errors,解决的是有效代码的错误,有时候被称为exceptions 异常。如果是在parse-time,解析事件出现的错误,则引擎无法理解代码,无法恢复。
parse-time=>runtime
针对scheduled 定时任务的异常处理
如果定时任务在try 中
try{
setTimeout(func,1000);
}
catch(error){
// 不会被执行,即错误不会被捕获,原因是代码已经走过了,但定时任务还没有执行
}
解决方法:
将try catch包含在定时任务中
setTimeout(function()
{
try{
//函数代码
}
catch(error){
//捕获代码
}
},1000);
这样就可以对定时scheduled任务进行异常处理了。
Error 对象
在catch中Error对象的名字可以任意定义(符合规定)
Error的属性
name
名字例如,对于一个未定义的变量,名称是 “ReferenceError”;
message
详细描述
stack
当前的调用栈
Error 在catch中是可选的
下面格式也是正确的
try{
}
catch{
// 没有Error对象
}
自定义error
定义:
我们自己为了解决某些系统认为正常,但不符合我们自己需求的异常。
自定义方法:
非标准方法
if(发生错误){
throw 一个对象
}
这个对象最好是包含name, 和message,这是为了和系统的error兼容。
标准方法
let error = new Error(message);
let error = new SyntaxError(message);
let error = new ReferenceError(message);
if(条件){
throuw new Error(message);
}
rethrow 精确处理error
try中发生的所有错误都会被catch捕获,但我们一般处理我们想要处理的error,其他的error将rethrow出去
如下,针对SyntaxError进行处理
catch(e){
if (e instanceof SyntaxError) {
alert( "JSON Error: " + e.message );
} else {
throw e; // 再次抛出 (*)
}
}
再次抛出的会被外部的catch捕获
try…catch…finally
finally 在最后是默认执行的代码。就像switch里的finally一样
finally在try…catch的任何出口之前运行,例如return之前会运行finally中的代码
try…finally
用处:即使try中代码执行失败,finally的代码在结束前也会执行
全局catch window.onerror
window.onerror = function(message,url,line,col,error){
// 处理代码
}
message 错误信息
url 错误的脚本url
line col 发生错误的代码行号和列号
error Error对象
作用:
不是恢复脚本执行,脚本依然死掉,但window.onerror会执行处理代码,将错误信息发送给开发者