动态导入失败时返回被拒绝的 promise,需用 catch 或 await+try...catch 显式处理;错误可按类型区分处理,未捕获异常可通过 unhandledrejection 全局监听兜底。

动态导入(import())失败时,会返回一个被拒绝的 Promise,直接用 catch 捕获即可。关键在于不能只依赖 try...catch——因为 import() 本身返回 Promise,必须显式处理拒绝状态。
用 catch() 处理 Promise 拒绝
import() 是异步操作,返回 Promise,网络错误、404、CORS、解析失败等都会导致 Promise reject。最直接的方式是链式调用 catch:
import('./module.js')
.then(module => {
// 加载成功,使用 module
})
.catch(err => {
console.error('动态导入失败:', err);
// 可降级加载备用逻辑、提示用户、上报错误等
});
在 async/await 中用 try...catch
配合 async/await 时,try...catch 能正常捕获,但要注意:必须 await 导入表达式,否则不会进入 catch 块:
async function loadModule() {
try {
const module = await import('./module.js'); // ✅ 正确:await 触发 Promise reject 捕获
return module;
} catch (err) {
console.warn('模块加载异常:', err.message);
// 例如 fallback 到本地 mock 或空对象
return { default: () => {} };
}
}
⚠️ 错误写法:import('./module.js') 不加 await,就只是创建 Promise 并立即继续执行,异常不会被当前 try...catch 捕获。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
区分不同失败原因(可选增强)
错误对象通常包含有用信息,比如 err.message 可能是 "Failed to fetch"(网络中断)、"Unable to load script"(React Native)、或具体 HTTP 状态(需服务端配合)。可据此做差异化处理:
-
err.name === 'TypeError' && err.message.includes('fetch')→ 网络请求失败,可重试或提示“请检查网络” -
err.message.includes('404')或err.message.includes('Not Found')→ 资源路径错误,可记录日志并触发构建校验 -
err instanceof SyntaxError→ 模块语法错误(如 ES6+ 未转译),需检查打包配置
全局兜底:监听 unhandledrejection
未被捕获的动态导入异常会触发 unhandledrejection 事件,适合做统一错误收集(如上报监控系统):
window.addEventListener('unhandledrejection', event => {
console.warn('未捕获的动态导入异常:', event.reason);
// 上报到 Sentry / 自建监控等
event.preventDefault(); // 阻止默认控制台警告(可选)
});
注意:这只是兜底,不能替代主动 catch,否则用户体验差(例如白屏无提示)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










