try...catch
同步捕获运行时错误:
js
try {
// 代码...
} catch (err) {
// 错误捕获
}
Error 对象
err 也就是 Error 对象主要有两个属性 name
和 message
,还有 stack
属性,它包含有关函数调用的信息,可以用于调试。
不需要 error 的具体信息时,可以省略参数,catch { }
即可。
可以自己抛出 error,比如 throw new Error('o_O')
,它的 name 就是 Error,message 就是 o_O。
js
let json = '{ "age": 30 }' // 不完整的数据
try {
let user = JSON.parse(json) // <-- 没有 error
if (!user.name) {
throw new SyntaxError('数据不全:没有 name') // (*)
}
alert(user.name)
} catch (err) {
alert('JSON Error: ' + err.message) // JSON Error: 数据不全:没有 name
}
rethrowing
catch
应该只处理它知道如何处理的错误,而不是所有错误,如果不知道如何处理,可以将 error 传递给外部的 try...catch
。
try...catch...finally
finally
代码块在所有情况下都会被执行。
try
块中声明的变量只在 try
块中可见。
全局 catch
js
window.onerror = function (message, url, line, col, error) {}
也可以使用提供 error 日志的 web 服务,它们会注册该服务并将一段 JS 代码插入到页面中,该代码设置了自定义的 window.onerror
函数,发生 error 时会发送一个 error 相关的网络请求到服务提供方,登录服务方的 Web 页面即可查看。
自定义 error
通过继承 Error 类来创建自定义 error,可以添加自定义属性。
js
class MyError extends Error {
constructor(message) {
super(message)
this.name = this.constructor.name
}
}
class ValidationError extends MyError {}
class PropertyRequiredError extends ValidationError {
constructor(property) {
super('No property: ' + property)
this.property = property
}
}
使用 instanceof
来检查特定的 error,但对于来自第三方库的那些没法简单获取类的 error 对象,可以使用 name 属性用于这一类的检查。