浅析JavaScript中的错误处理:throw、try 和 catch、finally 语句
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