JavaScript中try...catch...finally的执行机制与嵌套异常处理详解
本文详细解析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程序设计有所帮助。
JS大数值转字符串出现科学计数法怎么办
2026-11-05 17:09:21
JS split切割后出现空字符串怎么过滤
2026-11-05 16:00:30
在 React 或 Vue 项目中封装使用 JS 节流防抖
2026-11-05 15:27:29
JavaScript中怎么将带小数的字符串转为整数?
2026-11-05 14:32:38
怎么用JavaScript策略模式重构电商促销计算逻辑?
2026-11-05 14:01:09
