JS学习笔记8_错误处理

1.错误处理语法:(js没有异常exception一说,都是错误error)

try{
  //throw new Error(msg);
  //throw '错误';
  //throw false;
  //throw ...
  //throw操作符的操作数没有任何限制,可以随便扔
}
catch(err){
  //alert(err.message);//message是唯一一个全浏览器支持的属性
}
finally{
  //
}

注意:[IE7-]有个bug:没有catch块,finally块就不执行,所以尽量使用完整的try-catch-finally

高程中有一个描述上的错误(中文版501页):

请读者务必记住,只要代码中包含finally子句,那么无论try还是catch语句块中的return语句都将被忽略。

本机测试结果:对于进入finally之前遇到的return,在finally完成之后还会return。而不是书上说的“忽略”,应该只是歧义。

此外,js存在和java异常处理一样的秘密,例如:

//代码来自http://www.cnblogs.com/averey/p/4379646.html
function aaa(){
  var x = 1;

  try {
    return ++x;
  } catch (err) {

  } finally {
    ++x;
  }
  return x;
}

(function(){
  var y = aaa();
  alert(y);//2
})();

详情请查看:

当然,这种小秘密知道就好,不必深究

2.七种错误类型

  • Error

  • EvalError

  • RangeError

  • ReferenceError

  • SyntaxError

  • TypeError

  • URIError

3.error事件

作为避免浏览器报错的最后一道防线,语法如下:

window.onerror = function(msg, url, line){
  return true;//不报错
}

注意:只能用上面的DOM0级方式添加事件处理器,因为它没有遵循DOM2级标准

注意:高程中文第三版506页有点问题,实际上是返回true表示不报错,而不是书上的返回false,测试代码如下:

window.onerror = function(e) {
  return true;//Chrome, FF, IE8都不报错
  //return false;//Chrome, FF报错,IE8不报错
}
'str'.startWith('x');///触发错误

4.一些常识

  1. 尽量使用===和!==来比较,以避免类型转换和类型转换错误

  2. 在控制语句中尽量使用布尔值,而不要用if(value)这样的结构,因为自动进行的类型转换会导致存在多个假值:

    • false

    • +0/-0

    • undefined

    • null

    • ”/””(空字符串)

    • NaN

这些假值可能会导致出乎意料的结果,如果只用===和!==的话就只有false一个假值,可以精确地表意

  1. 不要用if(value != null)和if(value != undefined)这样的检测,而应该:

    • 用if(value instanceof Type)来检测对象值

    • 用if(typeof value === strType)来检测基础类型值

  2. 不要用body中的脚本进行document.body相关DOM操作(增删节点),因为可能会引发IE错误

  3. 外部js文件也可能会导致js语法错误,而报错信息望望不准确,难以发现,所以在引用外部脚本之前应该做充分的测试

  4. IE对URI长度限制不超过2048个字符,因此在使用get替代post请求优化性能的时候,应该尽量减少查询字符串的长度(比如用短点的字段名)

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

code