如何通过 try...catch 块很好地覆盖 await?

问题描述 投票:0回答:1

这段代码很丑,不是吗?

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 块

async-await nestjs try-catch coding-style unhandled-promise-rejection
1个回答
0
投票

问题不是很清楚,但我会尽量以最好的方式回答。对于上面的模式,如果你只想在每个模式中返回错误,你可以有类似的东西

    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);
  1. 如果你在错误的每个函数中都有不同的实现,你可以在每个函数中使用 .then 和 .catch 的语法。

  2. 如果您使用的是 NestJS,您可以利用 Exception Filters 获取发生错误的上下文并轻松处理它。

  3. 不完全是,但您也可以使用高阶函数来进行错误处理。

    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 类和过滤器,可以更清洁代码。此外,您也可以编写自定义异常过滤器,但这可能有点矫枉过正。如果你能更多地解释你的用例,那么它会更有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.