错误处理与调试

138 阅读3分钟

移动版浏览器控制台

谷歌移动版和ios移动版内置了实用工具,支持将设备连接到宿主操作系统中相同的浏览器,然后就可以在对应的桌面浏览器中查看错误了。

此外也可以使用第三方工具直接在移动设备调试,在移动版浏览器上打开调试界面。

try/catch语句:

try{

 //可能出错的代码

}catch(error){

//error错误对象必须定义,无论是否使用,肯定有message、name属性,不同浏览器还有一些其他的专有属性。

//出错时要做什么

}finally{

//finally语句块是可选的,但是却是始终运行的;
//try/catch块中的return也无法阻止finally语句块的执行,try/catch块中的return会被忽略。

}

如果try块中有代码发生错误,代码会立即退出执行,并跳到catch块中。

try/catch语句中发生错误时,浏览器会认为错误被处理了,因此就不会再使用本章前面提到的机制错误。也就是控制台中不会显示错误,代码不会终止,会继续执行。

错误类型

Error:

Error是基本类型,其他错误类型继承该类型。

InternalError:

在底层js引擎抛出异常时由浏览器抛出。例如递归过多导致的栈溢出。

EvalError:

在使用eval()函数发生异常时抛出。

RangeError:

在数值越界时抛出。

ReferenceError:

在找不到对象时发生。这种错误是由访问不存在的变量而导致的。这也是“object expected"浏览器错误的原因。

SyntaxError:

在给eval()传入的字符串包含js语法错误时发生。

TypeError:

主要发生在变量不是预期类型,或者访问不存在的方法时。

URIError:

在使用encodeURI()或decodeURI()传入了格式错误的URL时发生。

抛出错误:throw 任何类型的值

  使用throw操作符时,代码会立即停止,除非try/catch语句捕获了抛出的值。

捕获错误的目的是阻止浏览器以其默认方式响应;抛出错误的目的是为错误提供有关其发生原因的说明。

error事件

  任何没有被try/catch语句处理的错误都会触发window对象上的error事件。
  
  window.onerror = (message,url,line)=>{只支持此种方式添加错误事件处理程序
      console.log(message)
      return false;可以返回false来阻止浏览器默认报告错误的行为。相当于try/catch语句。
  }
  
  try/catch语句会拦截捕获块内的错误,致使错误不会触发window.onerror事件。
  

一般来说,原始类型的值应该使用typeof 检测,而对象值应该使用instanceof检测。

警告框会阻塞代码的执行。

用选择元素按钮选中某个元素,然后可以在控制台通过$0访问选中的那个元素进行操作。

debugger关键字

  在运行时碰到这个关键字,所有主流浏览器都会打开开发者工具面板,并在指定位置显示断点。此外还可以执行标准的代码调试操作(单步进入、单步跳过、继续等等)。
  
  

旧版本ie的常见错误:

无效字符:语法中没有定义过的字符。 invalid character :ie中; illegal character:火狐中;

未找到成员:member not found 。 这个错误通常会在给一个已经被销毁的对象赋值时发生。

语法错误:如果网页中引用的一个外部js文件,由于某种原因返回了非js代码,则ie会抛出语法错误。

系统找不到指定资源:The system cannot locate the resource specified. 请求路径长度超过最大url长度时发生这个错误。只有ie由这个长度限制。

try/catch语句和window.onerror可用于阻止浏览器对js错误做出反应。