gpt4 book ai didi

javascript - 尝试...catch 与 .catch

转载 作者:行者123 更新时间:2023-12-04 12:38:19 28 4
gpt4 key购买 nike

所以我在 service.ts 中有这个用户服务功能其中包括数据库的东西。

export const service = {
async getAll(): Promise<User[]> {
try {
const result = await query
return result
} catch (e) {
report.error(e)
throw new Error(e)
}
},

...
}

query.ts文件出于某些原因,例如:缓存、业务逻辑等。
export const query = {
async index(): Promise<User[]> {
try {
const result = await service.getAll()
return result
} catch (e) {
report.error(e)
throw new Error(e)
}
},

...
}

另一个上层为 routersresolvers ,因为我想在一个文件中查看所有路由。
export const resolver = {
Query: {
users: (): Promise<User[]> => query.index(),
},

...
}

我需要包装 try...catch在所有功能中?或者我不能只添加 .catch在最顶层是这样的:
export const resolver = {
Query: {
users: (): Promise<User[]> => query.index().catch(e => e),
},

...
}

最佳答案

Do I need to wrap try...catch in all functions?



不,你没有,除非你出于某种原因想在每个级别记录它。只需在顶层处理它。

async函数, promise 拒绝是异常(如您所知,因为您使用 try/ catch 与它们一起使用),并且异常通过 async 传播调用树,直到/除非他们被捕获。幕后, async函数返回 promise 并在发生同步异常或 promise async 时拒绝这些 promise 。函数是 await ing 拒绝。

这是一个简单的例子:

function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}

async function outer() {
// ...
await delay(10);

console.log("before calling inner");
await inner();
console.log("after calling inner (we never get here)");
}

async function inner() {
// ...
await delay(10);

console.log("inside inner");

// Something goes wrong
null.foo();
}

outer()
.catch(e => {
console.log("Caught error: " + e.message, e.stack);
});



附带说明:如果您确实捕获了一个错误,因为您想在错误传播之前执行 X 并且您将在执行 X 之后重新抛出错误,最佳实践是重新抛出您捕获的错误,而不是创造一个新的。所以:
} catch (e) {
// ...do X...
throw e; // <== Not `throw new Error(e);`
}

但只有在发生错误时确实需要执行 X 时才这样做。大多数时候,只需离开 try/ catch完全关闭。

关于javascript - 尝试...catch 与 .catch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62066299/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com