抛出自定义错误

什么?你问我为什么要抛出错误?程序员的天职难道不是干掉错误吗?
是的,我当初的想法也和你的一样,但是阅读完本文章,相信你会十分愿意去抛出一个错误。

错误的本质

当你在遇到了一些变量在不同浏览器的自定义值不一样的时候,或者是给一个函数传递了不正确的值,或者是运算的时候碰到一个非数字,就会导致一些错误,但是,如果这个错误,没有被返回给你的话,调试是非常困难的。如果所有的失败都是悄无声息的话,那么程序员就要爆炸啦boom!

在以前,js的错误总是特别稀少而且不精确,但是现在也会稍微好很多了。

在js中抛出错误

我们可以使用throw操作符,将提供的一个对象作为错误抛出。任何类型的对象都可以作为错误抛出,Error对象是最常见的。

1
throw new Error(message);

如果没有通过try-catch语句来捕获的话,浏览器通常直接显示该消息messageconsole控制台

有些同学可能会这样写

1
2
//不好的写法
throw "message"

在Firefox、Opera和Chorme里面都将显示一条throw "message"这样的错误,这对我们调试错误一点帮助也木有。

当然,如果你开心的话,可以用throw抛出任何类型的数据,没有任何规则约束不能是特定的数据类型

1
2
3
4
5

throw {name : 'dashabi'};
throw true;
throw 123456;
throw new Date();

但是….如果没有try-catch语句捕获,抛出任何值都将引发一个错误。

抛出一个好错误

抛出自己的错误,可以使用确切的文本提供浏览器显示。除了行列number,还可以包含任何你需要的有助于调试问题的信息。我推荐总是在错误消息中包含函数名称,以及函数失败的原因。

1
2
3
function getDiv(element){
return element.getElementsByTagName("div");
}

这个函数想获取所有div的元素,但是,传递给函数的DOM元素为null的值是很有可能是的,如果传给它一个null,你就会看到object expected这种含糊的错误,然后又得去看执行栈,再看实际定位到源文件中,通过抛出一个错误,调试会简单些

1
2
3
4
5
6
7
function getDiv(element){
if(element && element.getElementsByTagName){
return element.getElementsByTagName("div");
}else{
throw new Error("getDiv():Argument must be a DOM elemnt");
}
}

酱紫,你就能在浏览器控制台输出错误的时候,可以马上着手去调试,6666

何时抛出错误

  • 一旦修复了一个很难调试的错误,尝试增加一两个自定义错误。当再次发生错误的湿乎乎,有助于更容易的解决问题。
  • 如果正在写代码,思考下:“我希望某些事情最好不要发生,如果发生,我的代码就惨了”。这事,如果那件事情发生的话,就抛出一个错误
  • 如果再编写给别人的代码,思考一下别人的使用方式,在一些地方抛出错误。

try-catch

js提供了try-catch语句,能在浏览器处理抛出的错误之前来解析它,可以把能引发错误的代码放在try块中,处理错误的代码放在catch中。

1
2
3
4
5
try{
somethingThatMihtCauseAnError();
}catch(ex){
handleError(ex);
}

如果try中发生了一个错误,程序立刻停止执行,然后跳到catch块,并传入一个错误对象。检查该对象可以确定中恢复的最佳动作。

也可以在最后加一个finally块。finally块中的代码不管是否有错误发生,最后都会被执行

1
2
3
4
5
6
7
try{
somethingThatMihtCauseAnError();
}catch(ex){
handleError(ex);
}finally{
dosomething();
}

这个地方有点微妙,如果try中包含了一个return语句,实际上它必须等到finally块中的代码执行后才能返回,所以这个finally不常用。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×