什么?你问我为什么要抛出错误?程序员的天职难道不是干掉错误吗?
是的,我当初的想法也和你的一样,但是阅读完本文章,相信你会十分愿意去抛出一个错误。
错误的本质
当你在遇到了一些变量在不同浏览器的自定义值不一样的时候,或者是给一个函数传递了不正确的值,或者是运算的时候碰到一个非数字,就会导致一些错误,但是,如果这个错误,没有被返回给你的话,调试是非常困难的。如果所有的失败都是悄无声息的话,那么程序员就要爆炸啦boom!
在以前,js的错误总是特别稀少而且不精确,但是现在也会稍微好很多了。
在js中抛出错误
我们可以使用throw
操作符,将提供的一个对象作为错误抛出。任何类型的对象都可以作为错误抛出,Error对象是最常见的。1
throw new Error(message);
如果没有通过try-catch
语句来捕获的话,浏览器通常直接显示该消息message
在console
控制台
有些同学可能会这样写1
2//不好的写法
throw "message"
在Firefox、Opera和Chorme里面都将显示一条throw "message"
这样的错误,这对我们调试错误一点帮助也木有。
当然,如果你开心的话,可以用throw抛出任何类型的数据,没有任何规则约束不能是特定的数据类型
1 |
|
但是….如果没有try-catch语句捕获,抛出任何值都将引发一个错误。
抛出一个好错误
抛出自己的错误,可以使用确切的文本提供浏览器显示。除了行列number,还可以包含任何你需要的有助于调试问题的信息。我推荐总是在错误消息中包含函数名称,以及函数失败的原因。1
2
3function getDiv(element){
return element.getElementsByTagName("div");
}
这个函数想获取所有div的元素,但是,传递给函数的DOM元素为null的值是很有可能是的,如果传给它一个null,你就会看到object expected这种含糊的错误,然后又得去看执行栈,再看实际定位到源文件中,通过抛出一个错误,调试会简单些
1 | function getDiv(element){ |
酱紫,你就能在浏览器控制台输出错误的时候,可以马上着手去调试,6666
何时抛出错误
- 一旦修复了一个很难调试的错误,尝试增加一两个自定义错误。当再次发生错误的湿乎乎,有助于更容易的解决问题。
- 如果正在写代码,思考下:“我希望某些事情最好不要发生,如果发生,我的代码就惨了”。这事,如果那件事情发生的话,就抛出一个错误
- 如果再编写给别人的代码,思考一下别人的使用方式,在一些地方抛出错误。
try-catch
js提供了try-catch语句,能在浏览器处理抛出的错误之前来解析它,可以把能引发错误的代码放在try块中,处理错误的代码放在catch中。1
2
3
4
5try{
somethingThatMihtCauseAnError();
}catch(ex){
handleError(ex);
}
如果try中发生了一个错误,程序立刻停止执行,然后跳到catch块,并传入一个错误对象。检查该对象可以确定中恢复的最佳动作。
也可以在最后加一个finally块。finally块中的代码不管是否有错误发生,最后都会被执行1
2
3
4
5
6
7try{
somethingThatMihtCauseAnError();
}catch(ex){
handleError(ex);
}finally{
dosomething();
}
这个地方有点微妙,如果try中包含了一个return语句,实际上它必须等到finally块中的代码执行后才能返回,所以这个finally不常用。