try 语句测试代码块的错误。
catch 语句处理错误。
throw 语句创建自定义错误。
finally 语句在 try 和 catch 语句之后,无论是否有触发异常,该语句都会执行。
JavaScript 错误:当 JavaScript 引擎执行 JavaScript 代码时,会发生各种错误。可能是语法错误,通常是程序员造成的编码错误或错别字;可能是拼写错误或语言中缺少的功能(可能由于浏览器差异);可能是由于来自服务器或用户的错误输出而导致的错误;当然,也可能是由于许多其他不可预知的因素。
当错误发生时,当事情出问题时,JavaScript 引擎通常会停止,并生成一个错误消息。
throw 语句定义和用法
throw 语句抛出一个错误。当错误发生时, JS 会停止执行并抛出错误信息。
throw 语句创建自定义错误。技术术语是: 抛出异常。异常可以是 JavaScript 字符串、数字、逻辑值或对象:
throw "Too big"; // 抛出文本 throw 500; // 抛出数字
如果把 throw 与 try 和 catch 一起使用,那么您能够控制程序流,并生成自定义的错误消息。
function myFunction(x) { try { if(x == "") throw "is Empty"; if(isNaN(x)) throw "not a number"; if(x > 10) throw "too high"; if(x < 5) throw "too low"; } catch(err) { console.log(err) } } myFunction('') // is Empty
try 和 catch
try 语句允许我们定义在执行时进行错误测试的代码块。
catch 语句允许我们定义当 try 代码块发生错误时,所执行的代码块。
JavaScript 语句 try 和 catch 是成对出现的。
try { ... //异常的抛出 } catch(e) { ... //异常的捕获与处理 } finally { ... //结束处理 }
function message() { try { adddlert("Welcome guest!") } catch(err) { console.log(err) console.log(err.message) } } message() /* ReferenceError: adddlert is not defined at message (<anonymous>:3:5) at <anonymous>:1:1 adddlert is not defined */
我们可以看到不用 thorw 抛出错误,这里就捕获默认的错误,当我们需要抛出自定义错误的话,就可以使用上面的 throw 语句抛出自定义错误。
finally 语句
finally 语句不论之前的 try 和 catch 中是否产生异常都会执行该代码块。
这里需要注意的是,就算 try catch 里有 return false,finally 代码块也会执行的。
function myFunction(x) { try { // return false if(x == "") throw "is Empty"; if(isNaN(x)) throw "not a number"; if(x > 10) throw "too high"; if(x < 5) throw "too low"; } catch(err) { console.log(err) return false } finally { console.log('finally') } } myFunction('') // is Empty // finally // 函数返回 false
可以试一下,在try里加 return 或 catch 里加 return,它会不执行 try 或 catch 后面的代码块,但是 finally 代码块会始终执行的。
那么我们再想一想,如果在 finally return true 会改变函数的返回值吗?这里也看一下最终执行步骤:
function myFunction(x) { try { console.log('try') return false } catch(err) { console.log('catch', err) return false } finally { console.log('finally') return true } } myFunction() // VM802:3 try // VM802:12 finally // 返回 true
function myFunction(x) { try { console.lg('try1') console.log('try2') return false } catch(err) { console.log('catch', err) return false } finally { console.log('finally') return true } } myFunction() /* VM849:9 catch TypeError: console.lg is not a function at myFunction (<anonymous>:3:17) at <anonymous>:17:1 VM849:13 finally true */
从上面代码我们可以看到:
1、try 里没错误时,不走 catch,try 里返回了 false,但是函数最终返回值以 finally 里的 return true 为准,函数最终返回 true
2、try 里有错误时,错误后的代码都不会走,而走进 catch 里,catch 里返回了 false,但是函数最终返回值以 finally 里的 return true 为准,函数最终返回 true