异常处理
异常处理可以使程序在流程上更加完善。
在 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声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did92434