使用throw/catch的async函数中catch块是否需重抛错误?
是否需要在catch块中重新抛出错误?
结论:绝大多数情况下需要重新抛出,原因如下:
1. 保证错误的传递性
你的load函数是异步函数,返回的是Promise。如果不在catch块重抛错误:
- 当非测试模式执行
throw new Error('Can only run test mode in load')时,错误会被catch捕获并打日志,但之后Promise会变为resolved状态。调用方使用await load(false)或者.then()时,会误以为函数执行成功,完全不知道发生了错误。 - 当
createMyTestSuite抛出异常时,同样的,调用方无法感知到加载失败,这会导致后续依赖这个函数执行结果的逻辑出错。
只有重新抛出错误,调用方才能通过try/catch或者.catch()捕获到错误,进而做出相应的处理(比如终止流程、提示用户、重试等)。
2. 结合你的业务场景分析
你的函数语义是“加载测试套件”:
- 非测试模式下主动抛出错误,本质是非法调用,调用方必须知道这个错误,否则可能会继续执行不符合预期的逻辑。
createMyTestSuite执行失败属于业务异常,调用方也需要知晓并处理。
所以重抛错误是符合业务逻辑的必要操作。
额外优化点
当前catch块的日志信息failed to load create my test suite不够准确,因为它会捕获两种不同类型的错误:非测试模式的非法调用错误,和创建测试套件的异常。可以优化日志信息,区分不同错误场景:
public static async load(testMode: Mode): Promise<void> { try { if (testMode) { execute(); } else { throw new Error('Can only run test mode in load'); } await this.createMyTestSuite(); } catch(error) { if (error.message === 'Can only run test mode in load') { dLogger?.error('load called in non-test mode', {error}); } else { dLogger?.error('failed to create my test suite', {error}); } throw error; } }
内容的提问来源于stack exchange,提问作者rickygrimes
相关产品推荐
相关产品推荐

