自定义decodeURIRecursively递归解码合法URL报错如何修复
问题根因
你的代码核心问题是将整个递归解码的循环包裹在全局try/catch中,且循环判断条件直接调用了decodeURIComponent:
- 测试用的合法URL第一次解码后,
95%25会被转为95%,此时字符串中存在合法的未编码百分号 - 第二次进入循环判断条件时,
decodeURIComponent会尝试解析95%,但%后没有跟随两位十六进制字符,直接抛出URIError,触发全局catch逻辑返回空串,导致合法URL解码失败
修复方案
将单次解码操作移入循环内部的try/catch中,每次仅尝试一次解码,根据解码结果判断是继续循环、终止循环还是触发异常处理。以下是符合要求的实现代码:
const decodeURIRecursively = (req, url) => { // 必要参数缺失直接返回空 if (!req || !url) { return ''; } let currentUrl = url; while (true) { try { const decodedUrl = decodeURIComponent(currentUrl); // 解码结果与原值一致,说明已完成全部解码,退出循环 if (decodedUrl === currentUrl) { break; } currentUrl = decodedUrl; } catch (e) { // 解码失败判定为非法编码,返回空串符合异常处理要求 return ''; } } return currentUrl; };
效果验证
- 合法URL场景:调用
decodeURIRecursively({},"https%3A%2F%2Fgmail.com%3Frate%3D95%25"),返回结果为https://gmail.com?rate=95%,符合预期 - 非法编码场景:调用
decodeURIRecursively({},'%E0%A4%A'),解码失败直接返回空串,符合异常处理要求
内容的提问来源于stack exchange,提问作者Ankita
相关产品推荐
相关产品推荐

