好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

异常处理

异常处理

异常处理可以使程序在流程上更加完善。

在 JavaScript 中可以使用 throw 抛出异常,使用 try ... catch 捕获 错误 。

1. throw

throw 语句用来抛出 一个 用户 自定义 的异常。(MDN)

throw 用于抛出 一个 异常,这种异常通常是程序出现了不符合预期的 错误 。

  alert  (  '出错前'  )  ; 

 throw   '发生了 一个  错误 !'  ; 

 alert  (  '出错后'  )  ; 
 

当出现 throw 时,程序将会中断执行。

如果 throw 发生在 try ... catch 中,则会执行 catch 中的 代码 块,同时将 异常信息 带给 catch。

2. try … catch

try…catch 语句 标记 要尝试的语句块,并指定 一个 出现异常时抛出的响应。

try ... catch 可以用于捕获异常,当出现 throw 时,会结束 try 内的 代码 执行,直接进入到 catch ,执行 catch 内的 代码 块。

  try   { 
   alert  (  '出错前'  )  ; 

   throw   '发生了 一个  错误 !'  ; 

   alert  (  '出错后'  )  ; 
 }   catch   (  e  )   {   // e 是 错误 信息,名字随意,符合变量命名规范就行 
   alert  (  '出错了! 错误 是:'   +  e )  ; 
 } 
 

需要注意的是,以前 catch 后面的 错误 参数是必须接收的,否则会报错。

但 ES2019 中有 一个 提案,可以选择性的提供给 catch 参数,所以最新的 chrome 不传递 错误 参数也是可以的。

  try   { 
   alert  (  '出错前'  )  ; 

   throw   '发生了 一个  错误 !'  ; 

   alert  (  '出错后'  )  ; 
 }   catch   { 
   alert  (  '出错了!'  )  ; 
 } 
 

由于是比较新的提案,所以建议没有工具参与 代码 编译时,还是写上 错误 参数的接收,避免因浏览器兼容性造成的问题。

在 try 后面还可以跟 finally 部分,即无论 try 中的 代码 块是否抛出 错误 ,都会执行 finally 代码 块。

  try   { 
   alert  (  '开始请求数据,loading  显示 '  )  ; 

   throw   '没有网络'  ; 

   alert  (  '请求结果是:..编不下去了,反正到不了这里'  )  ; 
 }   catch   (  e  )   { 
   alert  (  '出现 错误 :'   +  e )  ; 
 }   finally   { 
   alert  (  ' 关闭  loading'  )  ; 
 } 
 

3. 可以写条件的 catch 语句

部分文献记载了如下格式的 try … catch 语法。

  try   { 
   throw   'error'  ; 
 }   catch   (  e   if  e  instanceof   TypeError  )   { 
  console .  log  (  'TypeError'  )  ; 
 }   catch   (  e   if  e  instanceof   ReferenceError  )   { 
  console .  log  (  'ReferenceError'  )  ; 
 }   catch   (  e  )   { 
  console .  log  ( e )  ; 
 } 
 

但目前主流浏览器基本都无法正常运行这种语法的 try … catch 语句,所以不要使用。

如果有类似的需求,可以使用 if 来代替。

  try   { 
   throw   'error'  ; 
 }   catch   (  e  )   { 
   if   ( e  instanceof   TypeError  )   { 
    console .  log  (  'TypeError'  )  ; 
   }   else   if   ( e  instanceof   ReferenceError  )   { 
    console .  log  (  'ReferenceError'  )  ; 
   }   else   { 
    console .  log  ( e )  ; 
   } 
 } 
 

4. Error 对象

通过 Error 的构造器可以创建 一个 错误 对象。当运行时 错误 产生时,Error的实例对象会被抛出。Error 对象也可用于 用户 自定义 的异常的基础对象。(MDN)

通常在使用 throw 抛出异常时,会抛出 一个 Error 对象的实例。

  try   { 
   throw   new   Error  (  '主动抛出 一个  错误 '  )  ; 
 }   catch   (  e  )   { 
  console .  error  ( e )  ; 
 } 
 

和大部分内置对象一样,Error 实例也可以不使用 new 关键字创建。

  try   { 
   throw   Error  (  '主动抛出 一个  错误 '  )  ; 
 }   catch   (  e  )   { 
  console .  error  ( e )  ; 
 } 
 

抛出 Error 实例,可以得到出现异常的 文件 和对应的行号。

除了 Error ,还有几种预定义好语义的异常对象。

5. 其他异常对象

URIError 表示以一种 错误 的方式使用全局URI处理 函数 而产生的 错误 ; TypeError 值的类型非预期类型时发生的 错误 ; Syntax Error 尝试解析语法上不合法的 代码 的 错误 ; ReferenceError 当 一个 不存在的变量被引用时发生的 错误 ; RangeError 当 一个 值不在其所允许的范围或者集合中抛出的异常; InternalError 表示出现在 JavaScript 引擎内部的 错误 。非标准对象,不建议使用; EvalError 本对象代表了 一个 关于 eval 函数 的 错误 .此异常不再会被 JavaScript 抛出,但是EvalError对象仍然保持兼容性。

这些异常对象的使用和 Error 几乎一致。

浏览器碰到对应的异常,也会抛出。

  try   { 
    console .  log  ( notDefinedVariable )  ; 
 }   catch   (  e  )   { 
    console .  error  ( e )  ; 
 } 
 

因为 notDefinedVariable 并没有定义,所以浏览器会抛出 ReferenceError 异常,同时 提示 变量没有定义。

6. 小结

完整的产品业务逻辑流程,基本都要 try ... catch 参与控制,因为出现异常时,还要有对应的动作,如网络请求异常,则 提示 用户 重试,或主动进行超时重新请求操作。

三元运算符 ? ?AJAX

查看更多关于异常处理的详细内容...

  阅读:38次

上一篇

下一篇

第1节:什么是 JavaScript    第2节:学习环境准备    第3节:调试方案    第4节:JavaScript 变量    第5节:JavaScript 数据类型    第6节:JavaScript if 语句    第7节:for 语句    第8节:JavaScript 算数运算符    第9节:JavaScript 比较运算符    第10节:JavaScript 逻辑运算符    第11节:JavaScript 函数    第12节:JavaScript 表达式    第13节:JavaScript 对象    第14节:JavaScript 字符串    第15节:JavaScript 数字    第16节:JavaScript 数组    第17节:JavaScript switch 语句    第18节:JavaScript while 语句    第19节:JavaScript 的 break 与 continue    第20节:JavaScript with    第21节:document.cookie    第22节:JavaScript Function    第23节:JavaScript Math    第24节:JavaScript Date    第25节:JavaScript RegExp    第26节:JavaScript JSON    第27节:什么是 DOM    第28节:DOM 和 JavaScript 的关系    第29节:获取和操作 DOM 节点    第30节:DOM 与事件    第31节:DOM 事件绑定    第32节:DOM 事件对象    第33节:DOM 事件流    第34节:事件相关的优化    第35节:自定义事件    第36节:表单校验    第37节:什么是 BOM    第38节:常用的 BOM 相关对象    第39节:BOM 常用属性和方法    第40节:AJAX    第41节:异常处理    第42节:三元运算符    第43节:逗号操作符    第44节:void    第45节:typeof    第46节:delete 操作符    第47节:debugger    第48节:getter & setter    第49节:new 运算符与构造函数    第50节:JavaScript 原型    第51节:JavaScript instanceof    第52节:JavaScript this    第53节:严格模式    第54节:作用域    第55节:闭包    第56节:变量提升    第57节:对象包装器    第58节:Lodash    第59节:moment    第60节:swiper    第61节:ECMAScript 6    第62节:Node.js    第63节:Babel    第64节:CSS 预处理器    第65节:代码规范    第66节:TypeScript    第67节:WebComponents    第68节:Vue、React、Angular    第69节:小程序    第70节:JavaScript 关键字    第71节:分号导致的问题    第72节:对象属性访问问题    第73节:this 使用问题    第74节:浮点数精度问题    第75节:独一无二的 NaN    第76节:避免全局污染    第77节:控制台观察对象问题    第78节:根据环境选择语言特性    第79节:相关资源