用于捕获错误,使得脚本可以执行更合理的操作,而不是立即停止。
**注意:**try…catch只对运行时的error有效,要使其工作,代码必须是有效的js代码,若代码包含语法错误,则其将无法正常工作。
try…catch语法:
由两部分组成:try和catch:
try {
// 代码...
} catch (err) {
// 错误捕获
}
执行步骤流程图如下:
try {…} 块内的 error 不会杀死脚本 —— 我们有机会在 catch 中处理它。
示例:
1.没有error:显示alert(1)和alert(2)
try {
alert('开始执行 try 中的内容'); // (1) <--
// ...这里没有 error
alert('try 中的内容执行完毕'); // (2) <--
} catch (err) {
alert('catch 被忽略,因为没有 error'); // (3)
}
2.有error:显示alert(1)和alert(3)
try {
alert('开始执行 try 中的内容'); // (1) <--
lalala; // error,变量未定义!
alert('try 的末尾(未执行到此处)'); // (2)
} catch (err) {
alert(`出现了 error!`); // (3) <--
}
Error对象:
发生错误时,js会生成一个包含此error详细信息的对象,然后将该对象作为参数传递给catch:
try {
// ...
} catch (err) { // <-- “error 对象”,也可以用其他参数名代替 err
// ...
}
对于所有内建的 error,error 对象具有两个主要属性:
1.name:Error 名称。例如,对于一个未定义的变量,名称是 “ReferenceError”。
2.message:关于 error 的详细文字描述。
还有其他非标准的属性在大多数环境中可用。其中被最广泛使用和支持的是:
stack:当前的调用栈,用于调试目的的一个字符串,其中包含有关导致 error 的嵌套调用序列的信息。
try {
lalala; // error, variable is not defined!
} catch (err) {
alert(err.name); // ReferenceError
alert(err.message); // lalala is not defined
alert(err.stack); // ReferenceError: lalala is not defined at (...call stack)
// 也可以将一个 error 作为整体显示出来
// error 信息被转换为像 "name: message" 这样的字符串
alert(err); // ReferenceError: lalala is not defined
}
如果不需要 error 的详细信息,catch 也可以忽略它:
try {
// ...
} catch { // <-- 没有 (err)
// ...
}