TypeError异常处理问题:脚本遇split报错后无法继续执行
问题分析与修复方案
嘿,你的问题出在异常发生的位置不在外层try/catch的覆盖范围内,所以外层的catch根本抓不到onload回调里抛出的错误,导致脚本直接停掉。
为什么外层catch没用?
你把try/catch包在了GM_xmlhttpRequest的调用外面,但onload回调是在请求完成后才被执行的——哪怕你开了synchronous: true,回调函数的执行上下文已经跳出了外层try的作用域。所以当回调里的split因为找不到目标字符串而抛出Cannot read property 'split' of undefined时,外层的catch完全感知不到这个异常。
两种修复思路
思路1:把try/catch移到回调内部
直接把异常捕获逻辑放在onload里面,这样就能覆盖到split可能抛出的错误:
function general(html){ GM_xmlhttpRequest({ method: "GET", url: ""+url, synchronous: true, onload: function(response) { try { var e = response.responseText.split('<source src="')[1].split('"')[0]; // 这里可以继续处理获取到的e } catch (exception) { // 捕获到异常后,脚本会继续执行后续逻辑 console.log("当前请求处理失败,跳过:", exception.message); } } }); }
思路2:提前检查,从根源避免异常
比起事后捕获异常,提前判断目标内容是否存在会更稳妥,也更高效:
function general(html){ GM_xmlhttpRequest({ method: "GET", url: ""+url, synchronous: true, onload: function(response) { // 先拆分字符串,检查是否存在目标部分 const sourceSegments = response.responseText.split('<source src="'); if (sourceSegments.length > 1) { // 确认有目标内容后再做下一步拆分 const e = sourceSegments[1].split('"')[0]; // 处理e的逻辑 } else { // 没找到目标标签,做个日志或者直接跳过 console.log("当前页面未找到<source src>标签"); } } }); }
额外小提醒
我注意到你的函数参数是html,但代码里用的是url变量,最好确认这个url是正确定义的,不然可能会引发其他隐藏问题哦~
内容的提问来源于stack exchange,提问作者JohnDotOwl
相关产品推荐
相关产品推荐

