动态追加的JavaScript文件抛出异常,如何捕获?
如何捕获动态加载脚本中的异常
先说明你之前的方法无效的原因:
try/catch没用是因为appendChild只是把脚本标签插入DOM,脚本的执行是异步且脱离当前同步上下文的,抛出的异常不会被这个同步的try/catch捕获。- 给
dynamically_created_file_1_script_element加onerror无效,是因为这个事件仅在**脚本加载失败(比如文件404)**时触发,和脚本执行时抛出的异常无关。
以下是两种可行的解决方法:
方法一:监听全局error事件
脚本执行时的未捕获异常会冒泡到window的error事件,通过监听该事件可以捕获异常:
// 在file1.js中添加全局异常监听 window.addEventListener('error', (event) => { // 你抛出的是String对象,event.error就是这个String实例 if (event.error?.toString() === 'oops') { console.log('捕获到file2的异常:', event.error); // 在这里编写异常处理逻辑 } }); // 插入脚本 document.head.appendChild(dynamically_created_file_2_script_element);
如果需要仅捕获该特定脚本的异常,可以增加标记区分:
let isFile2Loading = false; window.addEventListener('error', (event) => { if (isFile2Loading) { console.log('file2抛出的异常:', event.error); isFile2Loading = false; } }); isFile2Loading = true; document.head.appendChild(dynamically_created_file_2_script_element);
方法二:脚本内部捕获并传递异常
如果能修改file2.js的代码,可以在脚本内部捕获异常,再通过自定义事件传递给file1.js:
修改file2.js:
try { throw new String("oops"); } catch (err) { // 触发自定义事件传递异常 window.dispatchEvent(new CustomEvent('file2Error', { detail: err })); }
在file1.js中监听自定义事件:
window.addEventListener('file2Error', (event) => { console.log('捕获到file2的异常:', event.detail); // 处理异常逻辑 }); document.head.appendChild(dynamically_created_file_2_script_element);
注意事项
你抛出的是new String("oops")(String对象)而非标准的Error实例,捕获时需要通过toString()或直接判断对象内容识别。如果是常规异常,建议抛出new Error("oops"),会更符合标准异常处理逻辑。
内容的提问来源于stack exchange,提问作者user1655229
相关产品推荐
相关产品推荐

