这段代码很丑,不是吗?
import axios from 'axios';
async function f1() {
try {
const resp = await axios.get('http://www.randomnumberapi.com/api/v1.0/randomnumber');
return resp.data[0];
} catch (err) {
throw err;
}
}
async function f2() {
try {
return 1 + (await f1());
} catch (err) {
throw err;
}
}
async function main() {
try {
return 1 + (await f2());
} catch (err) {
throw err;
}
}
try {
console.log(await main());
} catch (err) {
throw err;
}
但是好像,我也没有办法换个方式写。因为每个
await
都需要try...catch
。否则我有Unhandled promise rejection
错误。但是太多的try...catch
会使代码变得不那么好。
有没有一种方法可以使这段代码更好?
注 1:如果 Nest.js 有助于获得好的答案,我将使用它。 注2:我看过这样的答案,但它们略有不同: 如何避免使用 try...catch 块 移除过多的 try-catch 块 太多的 try/catch 块。这样合适吗? 糟糕的尝试捕捉块设计? 在 express 中尝试 catch 块
问题不是很清楚,但我会尽量以最好的方式回答。对于上面的模式,如果你只想在每个模式中返回错误,你可以有类似的东西
import axios from 'axios';
async function f1() {
const resp = await axios.get('http://www.randomnumberapi.com/api/v1.0/randomnumber');
return resp.data[0];
}
async function f2() {
return 1 + (await f1());
}
async function main() {
return 1 + (await f2());
}
const data = await main().catch(err =>console.log(`Had Error in catch. ${err}`))
console.log(data);
如果你在错误的每个函数中都有不同的实现,你可以在每个函数中使用 .then 和 .catch 的语法。
如果您使用的是 NestJS,您可以利用 Exception Filters 获取发生错误的上下文并轻松处理它。
不完全是,但您也可以使用高阶函数来进行错误处理。
import axios from 'axios';
async function ErrorHandler(errResolve, task, ...args) {
try {
const res = await task(args);
// Call any filtering or data manipulation here
return res
} catch(e) {
return errResolve(e);
}
}
async function f1() {
const resp = await axios.get('http://www.randomnumberapi.com/api/v1.0/randomnumber');
return resp.data[0];
}
async function f2() {
return 1 + (await f1());
}
async function main() {
return 1 + (await f2());
}
const res = await ErrorHandler(err => console.log(`Had Error. ${err}`), main)
console.log(res);
使用什么取决于用例。上面提到的可以通过多种方式进行清洁。使用 TS 类和过滤器,可以更清洁代码。此外,您也可以编写自定义异常过滤器,但这可能有点矫枉过正。如果你能更多地解释你的用例,那么它会更有帮助。