TypeScript的catch块中如何忽略特定自定义错误类型?
方案1:拆分Axios请求错误与业务逻辑错误,移除冗余try-catch
你原来的写法需要在catch里判断重抛,本质是把「Axios请求本身的错误」和「你手动抛的业务自定义错误」都包在了同一个try块里,完全可以把两者分离:
// 仅捕获Axios请求本身抛出的原生错误,直接包装为自定义错误向上抛出 const response = await axios.delete(deleteRequestURL, deleteRequestConfig) .catch(e => { // 这里可以加cause保留原始错误栈,方便上层日志排查 throw new MyCustomError(`Error while trying to reach the REST endpoint: ${e}`, e) }) // 业务逻辑层抛出的自定义错误不需要额外捕获,直接向上传递即可 if (isRequestResponseSuccessful(response)) { return response.data } throw new MyCustomError(`The DELETE request failed for some reason.`)
这种写法直接规避了catch块全分支重抛的问题,IDE不会再触发警告,逻辑也更清晰:请求层的错误在请求阶段处理,业务层的错误直接透传。
方案2:封装通用错误包装工具(适合多重复用场景)
如果项目里多处需要做「非自定义错误自动包装」的逻辑,可以封装一个高阶工具函数,避免重复写判断逻辑:
// 通用包装函数:仅对非MyCustomError类型的错误做包装 async function wrapError<T>(executor: () => Promise<T>, errorPrefix: string): Promise<T> { try { return await executor() } catch (e) { if (e instanceof MyCustomError) { throw e } throw new MyCustomError(`${errorPrefix}: ${e}`, e) } } // 调用示例 const response = await wrapError( () => axios.delete(deleteRequestURL, deleteRequestConfig), "Error while trying to reach the REST endpoint" ) if (isRequestResponseSuccessful(response)) { return response.data } throw new MyCustomError(`The DELETE request failed for some reason.`)
如果你的自定义错误类支持传入cause参数保留原始错误栈,上层打印日志时可以输出完整的错误链路,排查问题更方便。
内容的提问来源于stack exchange,提问作者stefanS
相关产品推荐
相关产品推荐

