javascript之错误篇


<!–markdown–>抛出你的错误

我们每天都书写着成千上万行的代码,每天都制造着各种千样的bug,或者是这样子,又或者是那样的。他们有些是可以预知的,往往更多又是不可预知的,唯一可以确定的是,它们不可避免,只要代码还存在。庆幸的是,像汽车拥有安全汽囊一样,我们可以在设计之初又或者在修改一段陈年代码时给代码加入错误处理机制。在错误发生的时候像安全汽囊一样“救客(zi)户(ji)一命”。
<p><!–more–></p>

如何抛出错误

javascript的错误消息以信息稀少、隐晦含糊而臭名昭著,再加上web端调试的复杂性,这使得在javascript中抛出错误要比在任何其他语言中做同样的事情都更有价值。javascript 为我们提供了 throw 操作符,将提供的一个对象抛出。

throw new Error(&#34;T^T出错了&#34;);
//并不好的写好,一些浏览器仅会显示uncaught exception(IE,没错,我说得就是你)
throw &#34;T^T出错了&#34;;
throw new Date();
throw 111

抛出错误的好处

如上所述,由于web端调试的复杂性,我们经常需要花上两三天的时间才能定位一个错误发生的原因,再加上一些无理的浏览器的蛮横,往往前端狗们只能默默的把烧烤酱往自己身上抹。经常,我会觉得图片比文字更有说服力。

请输入图片描述

刚好,合适的抛出错误帮我们完成了这个理想。

错误类型

javascript一共为我们提供了七种错误类型。当不同的错误条件发生时,便会触发不同的错误类型,当然我们也可以手工的去创建。

  • Error 所有错误的基本类型。实际上javascript引擎从来不会抛出该类型的错误
  • EvalError 当eval()函数中的语句发生错误时抛出
  • RangeError 当一个数字超过它的边界时抛出 例 var ary = new Array(-20);
  • ReferenceError 当期望的对象不存在时抛出 例 alert(nil)//nil对象并没被定义
  • SyntaxError 当发生语法错误时抛出 例如 var str = adfadfadfl,.xo33;,,,
  • URIError 当encodeURI uncodeURI 等函数中的uri格式错误时抛出
  • TypeError 当发生类型错误时抛出 如 var str = 10 ;

多样的错误类型能让我们更好的对错误进行定义与处理。

try{
    Boom(&#34;危险&#34;);
}
catch (e) {
    if (e instanceof TypeError) {
        //TypeError get
    }else if (e instanceof RangeError){
        //RangeError
    }
    ...
}

自定义错误类型

自定义错误类型是对系统已定义错误类型的一个补充,我们通过继承系统中的Error对象来扩充错误类型以更好的处理错误。例如:

function MyError(message) {
    this.message = message;
}
MyError.prototype = new Error();
throw new MyError(&#34;T^T这个错误类型是怎么回事阿~怎么和别人不一样&#34;);

try 和 catch

和其他语言一样,我们通过try 和catch 来捕捉错误。当try 代码块和出现错误时,会立马跳转到catch 代码块中进行错误处理。

try {
    throw new Error(&#34;T^T出错了&#34;);
}
catch (e) {
    handle(e)
}

何时抛出错误

我们抛出错误往往是为了更加清晰的获取错误信息或者在catch块中更好的进行错误救援措失。胡乱的抛出错误并不能解决以上问题,很可能还会让错误变得难以发现,还会在代码中浪费不必要的性能。关于如何抛出错误有一些很好的经验法则

  • 当修复了一个很难调试的错误,尝试增加一两个自定义错误。当再次发生错误 的时候,将更容易解决问题
  • 在编写代码时,思考一下:“我希望某些事情不会发生,如果发生,我的代码会一团糟”。这时,如果“某些事情”发生,抛出一个错误
  • 如果正在编写的代码别人也会使用。思考一下他们的使用方式,在特定的情况下抛出错误。

我们应该牢记,我们的目的不是为了防止错误,而是在错误发生的时候能更加容易地调试。
一般情况下,我们会在堆栈最深层,如类库中 抛出错误,在逻辑代码中将他们捕获。

ps:此篇内容为个人对 《javascript编码规范》 第十章的总结