JS - 错误处理

try...catch

同步捕获运行时错误:

js 复制代码
try {
    // 代码...
} catch (err) {
    // 错误捕获
}

Error 对象

err 也就是 Error 对象主要有两个属性 namemessage,还有 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 属性用于这一类的检查。

相关推荐
腾讯TNTWeb前端团队2 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰5 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪5 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪5 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy6 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom7 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom7 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom7 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom7 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom7 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试