这段代码在 Chrome 上的行为很有趣(在这里小提琴):
try {
open('6:-=');
} catch(e) {}
首先,尽管代码被包装在 try-catch 中,但还是会抛出错误:
无法打开带有无效 URL '%36:%04-=' 的窗口。
其次,在 URL 中插入无关字符,即%3
和%04
。
为什么 try-catch 不拦截错误,为什么 URL 有那些额外的字符?
这段代码在 Chrome 上的行为很有趣(在这里小提琴):
try {
open('6:-=');
} catch(e) {}
首先,尽管代码被包装在 try-catch 中,但还是会抛出错误:
无法打开带有无效 URL '%36:%04-=' 的窗口。
其次,在 URL 中插入无关字符,即%3
和%04
。
为什么 try-catch 不拦截错误,为什么 URL 有那些额外的字符?
try
/catch
没有任何影响,因为它不是例外。这只是打印到控制台的错误消息。你可以证明:
open('6:-=');
console.log(1); // logged as usual
基本上,它就像console.error()
不抛出异常一样,但它会向控制台打印一条类似异常的消息。
您的小提琴在冒号后面的字符串中包含一个不可打印的字符,ASCII 代码为 4 6:-=
,它是 URL 编码的,如%04
显示的错误中所示。此外,6:
提供的 URL 部分被解释为 URL 方案,它不能以数字开头,因此 Chrome URL 显然%36
也引用了 6,尽管 RFC 没有规定这种行为。
第一:正如 pimvdb 所说,这是因为它实际上并不是一个例外。
第二: %04 是 JSFiddle 插入的不可见字符。%36 是 Chrome 在为 URL 方案编码时将其转换为 %36 的数字 6。更新了没有 %04 的小提琴