摘要:中的传统做法假设代码块执行抛出错误,那么捕获该错误的写法为代码块执行,并抛出错误定时器我们先来针对上面的代码改写一下,加入一个定时器。像这样,将扔在定时器的外面,是无法捕获到内部的错误的。
ES5 中的传统做法
假设代码块执行抛出错误 fail,那么捕获该错误的写法为:
try { // 代码块执行,并抛出 fail 错误 throw new Error("fail"); } catch (e) { console.log(e); }定时器
我们先来针对上面的代码改写一下,加入一个定时器。
try { setTimeout(()=>{ throw new Error("fail"); // Uncaught Error: fail }, 1000); } catch (e) { console.log(e); }
像这样,将 try/catch 扔在定时器的外面,是无法捕获到内部的错误的。
正确的做法应该是:
setTimeout(()=>{ try{ throw new Error("fail"); } catch (e) { console.log(e); } },1000);Promise
function doSomething() { return new Promise((resolve, reject) => { // 同步代码中的 throw 可以被捕捉到 throw new Error("fail"); }); } doSomething() .then((x) => { console.log("success:", x); }) .catch((err) => { console.log("fail:", err); });
这样写是没有问题的,错误能够被捕获到。但只要稍微修改一下,可能就出现问题了。比如:
function doSomething() { return new Promise((resolve, reject) => { // 异步代码中的 throw 不能被 Promise 的 catch 捕捉到 setTimeout(() => { throw new Error("fail"); }, 1000); }); } doSomething() .then((x) => { console.log("success:", x); }) .catch((err) => { console.log("fail:", err); });
这里抛出但错误将不能被捕获。所以,在 Promise 中,我们一般通过 reject 来抛出错误。
function doSomething(x) { return new Promise((resolve, reject) => reject(x)); } doSomething("fail").then((x) => { console.log("success:", x); }).catch((err) => { console.log("fail:", err); }); // fail: fail
另外,还有一个比较有意思的细节,在 catch 之后继续添加 .then 会被继续执行。
function doSomething(x) { return new Promise((resolve, reject) => reject(x)); } doSomething("fail").then((x) => { console.log("success:", x); }).catch((err) => { console.log("fail:", err); // 这里可以写 return 给下面的方法继续执行 }).then((x) => { console.log("continue:", x); }); // fail: fail // continue: undefinedAsync/Await
本质上来讲, Async/Await 是通过 Promise 实现,所以基本跟上面 Promise 所讲的差不多。
可以在 await 方法外嵌套 try/catch,类似这样:
function doSomething(x) { return new Promise((resolve, reject) => reject(x)); } (async () => { try { const result = await doSomething("fail"); console.log("success:", result); // return 返回 } catch (err) { console.log("fail:", err); // return 返回 } })(); // fail: fail
但这里就有一个问题,比如函数需要有返回,那么返回的语句就需要写两次,正常但时候返回结果,错误的时候,返回一个 throw new Error() 或者其他的。有一个小的窍门,可以这样写:
function doSomething(x) { return new Promise((resolve, reject) => reject(x)); } (async () => { const result = await doSomething("fail").catch((err) => { console.log("fail:", err); return 0; // 默认值 }); console.log("success:", result); })(); // fail: fail // success: 0
在错误捕获到之后,重新分配一个默认值,让代码继续运行。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/88576.html
捕获或指定要求 有效的Java编程语言代码必须遵守捕获或指定需求,这意味着可能抛出某些异常的代码必须包含以下任一项: 捕获异常的try语句,try必须为异常提供处理程序,如捕获和处理异常中所述。 一种方法,指定它可以抛出异常,该方法必须提供一个throws子句,列出异常,如通过方法抛出指定异常中所述。 不符合捕获或指定要求的代码将无法编译。 并非所有异常都受捕获或指定要求的约束,为了理解原因,...
摘要:组成指针,指针代表捕获异常的范围,就是的范围。当触发异常的字节码的索引值在某个异常表条目的监控范围内,虚拟机会判断所抛出的异常和该条目想要捕获的异常是否匹配。 Java异常知识 1.异常的两大关键因素 (1)抛出异常1.显式:应用程序手动抛出异常。具体就是使用throw抛出异常2.隐式:Java虚拟机对于无法执行的代码,自动抛出异常(2)捕获异常1.try 代码块:用来标记需要进行异常...
摘要:但如果忽视异常轻则影响功能运行,重则导致系统崩溃,造成经济损失。异常处理捕获异常捕获关键字与一致,都是使用。语句块表示无论是否发生异常,语句块代码一定会被执行。 不少前端工程师看到这个标题可能会产生质问: 我js用得好好的,能后端能APP,为什么还要学习Python? 至少有下面两个理由: 学习曲线。ES6之后的JavaScript(TypeScript)的在语法上和Python有很...
摘要:另外这样的异常捕获不能捕获的异常错误信息,这点需要注意。最终大致的流程图如下结语前端异常捕获与上报是前端异常监控的前提,了解并做好了异常数据的收集和分析才能实现一个完善的错误响应和处理机制,最终达成数据可视化。 关于 微信公众号:前端呼啦圈(Love-FED) 我的博客:劳卜的博客 知乎专栏:前端呼啦圈 前言 Hello,大家好,又与大家见面了,这次给大家分享下前端异常监控中需...
摘要:二需要处理哪些异常对于前端来说,我们可做的异常捕获还真不少。总结一下,大概如下语法错误代码异常请求异常静态资源加载异常异常异常跨域崩溃和卡顿下面我会针对每种具体情况来说明如何处理这些异常。 前端一直是距离用户最近的一层,随着产品的日益完善,我们会更加注重用户体验,而前端异常却如鲠在喉,甚是烦人。一、为什么要处理异常?异常是不可控的,会影响最终的呈现结果,但是我们有充分的理由去做这样的事...
阅读 2538·2023-04-26 00:57
阅读 910·2021-11-25 09:43
阅读 2221·2021-11-11 16:55
阅读 2204·2019-08-30 15:53
阅读 3592·2019-08-30 15:52
阅读 1458·2019-08-30 14:10
阅读 3379·2019-08-30 13:22
阅读 1209·2019-08-29 11:18