JavaScript中try...catch...finally的执行机制与嵌套异常处理详解

作者:函数茶馆

时间:2026-10-29

浏览:156

本文详细解析JavaScript中try...catch...finally的执行流程。通过代码示例展示如何抛出不同类型错误,分析finally块在有无异常时的执行时机,并深入探讨嵌套try结构中异常向上传递的机制,帮助开发者准确掌握错误处理逻辑。

文章目录

JavaScript try...catch...finally基础执行机制

本文深入解析JavaScript中try...catch...finally语句的具体用法,旨在为读者提供清晰的技术参考。

在编程中,处理稍复杂的逻辑时通常需要借助if...else进行条件判断。对于开发者而言,这种基于条件的分支控制已是基础常识。

若需处理更复杂的场景,可将if...else条件判断与try...catch结合使用。尽管try...catch能处理任意对象,通过throw抛出错误语句后由catch捕获并处理该对象或错误信息,本文重点聚焦于try...catch机制,后续示例将分别展示抛出数组、Date对象、函数原型及数字类型等不同数据的情况。


function trycatch () {
  var array = [234],
    newdate = new Date(),
    fun = function(){},
    is = 12.22,
    call;
  try{
    throw array + '\n' + newdate.toLocaleString() + ' \n' + fun.prototype.constructor + 
    '\n' + (typeof is == 'number') +' \n' + call ; //小心local后面还有一个'e'
  }
  catch(e){
    console.log(e);
  }
  finally{
    console.log('err finally');
  }
}
trycatch () 

// 输出:

// 234

// 2015/10/12 下午10:07:03 

// function (){}

// true 

// undefined

准确而言,try块中应放置可能引发错误的代码。当try执行并抛出错误时,catch块才会执行其内部逻辑,并处理与try中对应的错误信息message。finally块的执行时机是在try和catch执行完毕后,无论try是否抛出异常或catch是否成功捕获,finally内的代码都会执行。

finally块的执行时机与输出行为


function trycatch () {
  try{
    throw new Error('koringz');
  }
  catch(e){
    console.log(e.message);
  }
  finally{
    console.log('err finally');
  }
}
trycatch ()
// 输出:
// koringz
// err finally

通过try抛出一条错误语句,可以看到catch捕获到了错误信息// koringz,同时finally也输出了// err finally。虽然已知try...catch的工作流,但许多开发者对finally块的具体处理逻辑仍存疑惑。按照常规理解,finally的输出似乎不受try和catch的限制,以下通过几个演示代码展示finally的行为。


function trycatch () {
  try{
    throw new Error('koringz');
  }
  finally{
    console.log('err finally');
    return console.log('new finally')
  }
}
trycatch ()
// err finally
// new finally

如上所示,当try抛出一条错误语句时,finally输出的结果为:// err finally // new finally。


function trycatch () {
  try{
    throw new Error('koringz');
  }
  catch(e){
    console.log('err finally');
    return console.log('new finally')
  }
}
trycatch ()
// err finally
// new finally

如上所示,当try抛出一条错误语句且catch捕获到错误时,输出结果与上例中finally的表现一致:// err finally // new finally。

当我修改try块中的语句,使其不抛出错误时:


function trycatch () {
  try{
    // 
  }
  catch(e){
    console.log('err finally');
    return console.log('new finally')
  }
}
trycatch ()
// 空(viod)
// 空(viod)

结果输出均为空// 空(viod)。这是因为try没有抛出错误,catch未捕获到任何异常,因此输出结果为空。

接下来通过一个案例进一步说明try...catch语句的异常处理机制。

嵌套Try结构中的异常传递与捕获


try{
  try{
    throw new Error('open');
  }
  catch(e){
    console.info(e.message);
    throw e
  }
  finally{
    console.log('finally');
  }
}
catch(e){
  console.log('op',e.message);
}
// open
// finally
// op open

当在可能引发错误的try代码块内嵌套另一个try...catch时,若内层try抛出错误语句throw new Error('open'),内层的try会将错误传递给内层的catch处理。内层finally执行完毕后,我们看到最后一条结果// op open,这实际上是内层catch捕获的错误信息被再次抛出,由最外层的catch捕获所致。// op open

也就是说:任何给定的异常只会被离它最近的封闭catch块捕获一次。

当然,如果在“内部”块中抛出了新的异常(因为catch块内的代码也可能抛出异常),该新异常将被“外部”块所捕获。

以上就是本文的全部内容,希望对学习JavaScript程序设计有所帮助。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章