跳到主要内容

错误处理

业务上错误处理

catch 后如果不手动抛出,会把错误消费掉, reject 后不 catch 也会有 unhandled error

业务上来说只应该 catch promise 接口中的错误,这是不需要上报的网络超时等异常,可以自己捕获并消费

而其他地方(代码书写异常)都应该抛给外层,所以不应该用 try catch,直接冒泡到外层走上报或者统一处理

const getInfo = () => {
return new Promise(() => {})
.then(() => {
// 统一处理 code !==0 弹窗就行
return [null, data];
})
.catch((err) => {
// 处理接口网络超时
return [err, undefined];
});
};

const main = async () => {
const [, res] = await getInfo();
// 只做成功处理
// if(res.code===0){
// setData(res.data)
// }

// 如果需要return出去再set(适用于分离请求/数据处理函数 与 set时
let result;
if (res.code === 0) {
result = res.data;
}
return result;
};

async

同时捕获同步和异步错误

reject 内部返回错误(能抛出并被 catch,因为是未处理的 Error 对象)+trycatch 包裹

async function run() {
try {
await Promise.reject(new Error("Oops!"));
} catch (error) {
error.message; // "Oops!"
}
}

仅捕获同步错误

仅 try catch 包裹

run();

async function run() {
const v = null;
try {
await Promise.resolve("foo");
v.thisWillThrow;
} catch (error) {
// "TypeError: Cannot read property 'thisWillThrow' of null"
error.message;
}
}

新手用 async/await 容易犯的错误之一,是忘记捕获错误,这是大忌,它会导致出现“S 级”的异常:**控制台既没有报错,期待的效果也没有 work,会导致很难定位问题。**以下的示例取自于一个个人比较常见的情景

import api from "./api.js"; // 引入了一个请求库

run();

async function run() {
const res = await axios.get("xxxx");
// 期待打印出请求结果,但因为没有做错误处理,
// 导致当网络请求出错时,这一行既没有走到,
// 控制台也没有抛出 Error,会很难定位问题
console.log(res);
}

async 捕捉错误缺点

  • 无法捕获 try 块中,被 return 的异步错误(可用 return await 解决)
  • 不适用于流程中不需要中断的错误
  • 无法避免 catch 本身抛出异常且不好处理

外层统一处理

async function thisThrows() {
throw new Error("Thrown from thisThrows()");
}

async function myFunctionThatCatches() {
try {
// 注意这里如果是异步错误,不加await会catch失败
return await thisThrows();
} catch (e) {
console.error(e);
} finally {
console.log("We do cleanup here");
}
return "Nothing found";
}

引用 https://github.com/davidlin88/blogs/issues/2