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