玩转try..catch

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)表示捕获的错误对象,包含错误的详细信息(例如 messagename 等)。

  • finally 块(可选)finally 块中的代码无论 try 块中是否发生错误都会执行,通常用于资源清理操作,例如关闭文件、清理缓存等。

    3.错误对象error属性

  • error.message:错误的简要描述。
  • error.name:错误的类型,例如 SyntaxErrorReferenceError
  • 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中一个重要的错误捕捉方法,掌握它,奥利给冲了😃

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值