浅析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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律