一:错误捕获
1.try-catch 语句(错误捕获)
try{ //这里放置可能出现问题的代码 }catch(error){ //错误发生时执行的代码 console.log(error.name) //打印错误类型 console.log(error.message) //打印错误消息 }
说明:如果try中的代码出现任何错误,就会立即退出代码执行过程,接着执行catch块。执行过catch块之后,浏览器默认错误已经处理。
2.finally 字句
try{ }catch(error){ }finally{ }
说明:无论try里面的语句有没有报错,catch里面的语句有没有执行到,都会执行finally语句
例:
function test(){ try{ return 1 }catch(error){ return 2 }finally{ return 0 } }
执行test函数,始终会返回0 因为最终都会执行finally块。
3.错误类型
Error:基类型,所有错误都继承该类型
EvalError:使用eval()函数(该函数可以执行js代码语句)异常时候抛出。通常是没有直接调用该函数会导致该错误
RangeError:数值超出相应范围触发 例如:定义一个长度为 -20 位的数组 var array = new Array(-20)
ReferenceError:找不到对象时触发 例如:var obj = x 在变量x未定义的情况下 抛出错误
SyntaxError:传入eval()函数的代码出现错误时抛出
TypeError:最常见,执行特定类型的操作时,变量的类型不符合要求导致 例如:访问不存在的方法、变量中保存着意外的类型
总结:什么时候试用try-catch语句捕获错误?
通常在大型的项目中,或者使用别人的库,源代码不能修改 处理那些我们无法控制的错误。
当你明确自己的代码在何时何地会出现什么错误,使用try-catch语句就不太合适了
二:错误抛出
1.throw 使用throw 操作符代码会立即停止执行,除非使用try-catch捕获错误
基本语法 throw new Error('您要自定义的错误信息') throw new TypeError()...................
自定义错误类型
function MyError(message){ this.name = MyError this.message = message } MyError.prototype = new Error() //继承Error 因为Error是所有错误类型的基类 使用:throw new MyError('我自己定义的错误类型')
完整案例:
function test(array){ if(!(array instanceof Array)){ throw new Error('参数不是数组') } array.sort(); for(var i = 0;i<array.length;i++){ if(array[i]>100){ return array[i]; } } return -1; }; 执行该函数需要传递一个数组类型的参数 首先验证参数是不是数组,如果不是数组则抛出错误
总结:捕获错误的目的为了防止浏览器以默认的行为处理错误,抛出错误的目的是可以获取详细具体的错误信息