try...catch,相比大家都不陌生这个抛出异常的语法,但是try..catch究竟是什么,在不同的场景下要如何使用它,今天就带大家来深究一下try..catch语法
一.何为try...catch?
try...catch
是 JavaScript 中的错误处理机制,用来捕获并处理代码执行中的异常。它可以避免程序因为异常(错误)而终止运行,从而提供更好的错误管理能力。
二.try..catch基本语法格式
try {
// 可能会抛出错误的代码
} catch (error) {
// 当错误发生时,执行此块代码
} finally {
// 不论是否发生错误,最终都会执行的代码块(可选)
}
2.组成部分解析
try
块:放置需要执行的代码,其中可能包含会引发错误的代码。如果错误发生,try
块的剩余代码会立即停止执行,并跳转到catch
块。
catch
块:用于捕获和处理try
块中抛出的错误。catch
括号内的参数(例如error
)表示捕获的错误对象,包含错误的详细信息(例如message
、name
等)。
finally
块(可选):finally
块中的代码无论try
块中是否发生错误都会执行,通常用于资源清理操作,例如关闭文件、清理缓存等。3.错误对象error属性
error.message
:错误的简要描述。error.name
:错误的类型,例如SyntaxError
、ReferenceError
。error.stack
:错误的堆栈追踪,显示错误发生的位置(常用于调试)。
三.简单示例代码
1.简单的try..catch
try {
let result = 10 / 0; // 数学上可行,不会抛出错误
console.log(result); // 输出: Infinity
JSON.parse("{ name: 'Alice' }"); // 错误: JSON 格式不正确
} catch (error) {
console.error("捕获的错误:", error.message);
}
在代码中,会输出result,然后运行到json后发现格式不正确,抛出错误,.catch捕获错误后,输出错误信息
2.finally块的使用
try {
console.log("打开数据库连接");
throw new Error("数据库连接失败"); // 模拟一个错误
} catch (error) {
console.error("捕获的错误:", error.message);
} finally {
console.log("关闭数据库连接");
}
根据finally的定义,无论try中是否抛出错误,finally块都会执行,那么该代码的运行结果为
打开数据库连接
捕获的错误:数据库连接失败
关闭数据库连接
这样就对一个简单的try..catch块进行了简单的输出
finally通常用来处理数据缓存等
四.嵌套的try...catch
在复杂的代码逻辑中,可以使用嵌套的 try...catch
来捕获不同层级的错误:
try {
try {
let data = JSON.parse("{ invalidJson }"); // 无效 JSON 格式,抛出 SyntaxError
} catch (error) {
console.error("JSON 解析错误:", error.message); // 输出内部捕获的错误信息
throw new Error("数据解析失败"); // 抛出新的错误供外部 try...catch 捕获
}
} catch (error) {
console.error("捕获到的错误:", error.message); // 输出外部捕获的错误信息
}
首先我们来看这个代码,内部try执行块中的 JSON.parse("{ invalidJson }");为无效的json格式,抛出错误,内部try块的 .catch捕捉错误后输出错误,在.catch中再抛出错误由外部.catch捕获到输出错误,实现了捕获不同层级的错误,输出如下
json解析错误:错误信息捕获到的错误:数据解析失败
这里,内部
catch
捕获了 JSON 解析错误,然后抛出一个新错误,该错误会被外部catch
捕获。这种方式在处理不同层级的错误时很有用。
五.异步函数中的try...catch
async function fetchData() {
try {
let response = await fetch("https://example.com/api");
let data = await response.json();
console.log(data);
} catch (error) {
console.error("获取数据出错:", error.message);
}
}
fetchData();
async 定义该函数为一个async类型,符合async语法规范,进入try块,进行网络数据请求
await语法申明该异步任务要等待网络请求结束后才会继续往下执行,如果网络请求失败,立即进入.catch块,第二句同理,try中的任何一句出现异常都会进入.catch块中,那么在这里为什么要使用async await语法呢,首先他是一个promise语法的语法糖,他可以让异步操作看上去更像一个同步语法操作,当await内的语法执行完后他才会执行接下来的操作,那么回归正题,我们为什么要使用它呢,因为如果不使用async语法,那么由于fetch是一个异步操作,他不会等待网络请求结束后再执行下面的语句,如果网速过慢等原因导致网络请求没有及时获取的话,错误可能无法被捕捉,从而出现异常状况。
网络错误:获取数据出错: Failed to fetch
json数据错误:获取数据出错: Unexpected token < in JSON at position 0
六.总结
try...catch
是 JavaScript 中处理错误的一种机制,可以让程序在发生错误时优雅地处理,而不是直接崩溃。通过 try...catch
,开发者可以编写更加健壮的代码,并提高用户体验
总而言之,言而总之,try..catch是javascript中一个重要的错误捕捉方法,掌握它,奥利给冲了😃