JavaScript中的Error错误对象与自定义错误类型

目录

Error对象

Error语法

Error属性和方法

六种常见错误类型

SyntaxError

TypeError

ReferenceError

RangeError

URIError

EvalError

自定义错误类型


Error对象

Error是JavaScript语言中的一个标准的内置对象,专门用于处理JS开发中的运行时错误。

当我们的JS代码在运行过程中发生错误的话,就会抛出Error对象,整个程序将会中断在错误发生的代码处,不再继续执行,这也是错误类型必须重视的原因:它会导致页面无法显示或者功能失效。

Error是JavaScript中最原始的错误对象,作为各种异常的基础对象,还有多个衍生的具体的错误类型,这些错误对象类型在nodejs中也可应用。

Error作为内置对象,它本身数据类型是 function,但被引用时它的数据类型是 object,和 ObjectArray 类似,使用 typeof 进行判断如下:

typeof Error // 'function'
typeof Error() // 'object'
typeof new Error() // 'object'

关于typeof的详细知识,可参考本博前文一文搞懂js中的typeof用法

Error语法

下面介绍下Error对象基本的语法知识。

Error对象既可以当作构造函数使用,也可以当作方法,一般有两个可选参数:

new Error(message, options)
Error(message, options)

可选参数说明如下:

  • message:错误信息描述
  • options:属性对象
  • cause:指定错误的具体原因

Error属性和方法

Error实例必然包含 message 属性,除此外一般还提供 name 和 stack 属性,而 cause 属性则根据定义来确定。

  • message:错误信息描述
  • name:错误的类型名字
  • stack:错误的堆栈轨迹,用于堆栈追踪
  • cause:当前错误被抛出的具体原因

下面通过一个示例,看下具体的属性信息:

const err = new Error('发生错误!', { cause: '333' })
console.log(err)
// Error: 发生错误!
//  at <anonymous>:1:13
console.log(err.message)
// '发生错误!'
console.log(err.cause)
// '333'
console.log(err.stack)
// Error: 发生错误!
//  at <anonymous>:1:13

如上代码,定义了一个错误对象,并赋予两个参数,在控制台输出,可以看到该错误对象具体的属性信息。

需要注意的是,只有定义了cause属性的Error实例,才有该属性,否则cause属性不存在,如下所示:

const err2 = new Error('发生错误!')
console.log(err2.cause)
// undefined

err2.cause的输出为undefined,因为构造函数并没有定义该属性。

Error对象没有自己特有的实例方法,只有继承自Object对象的,这里略过。

六种常见错误类型

Error对象衍生有六种常见的错误类型,属于Error的派生类,属性和方法也都继承自Error,下面一一介绍下这六种类型。

SyntaxError

SyntaxError 语法错误,表示JS代码发生的语法上的错误,包括各种不符合语法规范、书写错漏等情况。

如下变量名错误:

const 11 = 8
// Uncaught SyntaxError: Unexpected number

错误的代码语法:

Error(+)
// Uncaught SyntaxError: Unexpected token ')'

SyntaxError语法错误无法被捕获,因为语法错误不会被执行,直接抛出错误,所幸的是,现在的IDE工具和各种插件,已可规避大部分的语法错误。

TypeError

TypeError 类型错误,当代码中的变量参数等类型不对时,就会发生该类型错误。

比如,把属性当方法使用:

window.location()
// Uncaught TypeError: window.location is not a function
//    at <anonymous>:1:8

错误的构造函数使用:

new null()
// Uncaught TypeError: null is not a constructor
//    at <anonymous>:1:1

ReferenceError

ReferenceError 引用错误,当引用一个并不存在的变量时会发生的错误。

如直接在浏览器控制打印:

a
// Uncaught ReferenceError: a is not defined
//  at <anonymous>:1:1

cons.log('')
// Uncaught ReferenceError: cons is not defined
//  at <anonymous>:1:1

错误的值分配,给 null 赋值:

null = 1
// Uncaught SyntaxError: Invalid left-hand side in assignment

RangeError

RangeError 取值范围错误,当给某个对象指定一个不在取值范围内的特定值时发生的错误。

如给Array对象传入不合法的长度参数

Array(-1)
Array(Infinity)
// Uncaught RangeError: Invalid array length
//  at <anonymous>:1:1

数字类型方法的使用:

5..toFixed(200)
// Uncaught RangeError: toFixed() digits argument must be between 0 and 100
//  at Number.toFixed (<anonymous>)
//  at <anonymous>:1:4

toFixed() 参数取值范围在0到100之间,超过则会报错。

URIError

URIError 当使用URI相关方法处理数据时,当这些方法的参数不正确时导致的一些错误。

主要常见于URI的解码等方法decodeURI()、decodeURIComponent()等。

decodeURI('%')
decodeURIComponent('%')
// Uncaught URIError: URI malformed
//  at decodeURIComponent (<anonymous>)
//  at <anonymous>:1:1

EvalError

EvalError 当在使用eval函数时,发生的错误。eval不被推荐使用,该错误类型一般很少见,处于半废弃状态,为了兼容考虑才存在。

自定义错误类型

除了JavaScript自带的常见错误类型以外,我们还可以自定义特殊的错误类型。

处理起来也很简单,使用继承Error对象的方式即可。

class CharError extends Error {
  constructor(message = '字符错误') {
    super(message)
    this.name = 'CharError'
  }
}

以上代码使用es6的类继承方式,自定义一个错误类型继承Error对象,后续就可以使用新的 CharError 类型。

const ce = new CharError()
console.log(ce)
// CharError: 字符错误
//  at error.html:26:16

如上,与JavaScript内置错误类型使用方式一致。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: koa-parameter可以通过在校验规则添加第三个参数来自定义错误信息。例如: ```javascript const { validate } = require('koa-parameter'); router.post('/register', async (ctx) => { const { body } = ctx.request; validate(body, { name: { type: 'string', required: true, message: '姓名不能为空' }, age: { type: 'number', required: true, message: '年龄不能为空' }, }); // ... }); ``` 在上面的示例,我们为"name"和"age"两个参数设置了自定义错误信息。如果校验不通过,将会返回相应的错误信息,例如:"姓名不能为空"或"年龄不能为空"。通过自定义错误信息,我们可以更好地提示用户输入正确的参数,并提高应用程序的用户体验。 ### 回答2: 要自定义错误信息,可以使用koa-parameter间件的`validate`方法来添加自定义错误信息。 首先,在代码引入koa-parameter的`Parameter`类: ``` const Parameter = require('koa-parameter'); const parameter = new Parameter(); ``` 然后,可以使用`validate`方法来添加自定义错误信息。例如,假设我们有一个POST请求,需要验证请求体的用户名和密码是否存在: ``` app.use(async (ctx, next) => { try { // 使用koa-parameter间件验证请求体 ctx.verifyParams({ username: 'string', password: 'string' }); await next(); } catch (err) { // 通过自定义错误信息返回给客户端 ctx.body = { code: 400, message: err.errors[0].message }; } }); ``` 在上面的代码,我们使用`verifyParams`方法验证请求体的参数类型。如果验证失败,它会抛出一个错误对象`err`,其包含错误信息。我们可以通过`err.errors[0].message`来获取第一个错误信息,并将其返回给客户端。 为了提供更多自定义错误信息,可以使用`addRule`方法来添加自定义的验证规则。例如,我们想要添加一个验证邮件格式的规则: ``` parameter.addRule('email', (value) => { if (!/\w+@\w+\.\w+/.test(value)) { throw new Error('Invalid email format'); } }); ``` 在上面的代码,我们使用`addRule`方法添加了一个名为'email'的自定义规则。在规则的回调函数,我们可以根据需要进行验证,并抛出相应的错误信息。 最后,将自定义错误信息返回给客户端的方式可以根据实际需求进行调整。上述代码使用了简单的方式将错误信息包装成一个包含错误码和消息的对象,然后通过`ctx.body`返回给客户端。您可以根据具体情况选择其他适合的方式来返回错误信息。 这样,我们就可以使用koa-parameter来自定义错误信息了。 ### 回答3: 在使用koa-parameter时,可以通过自定义错误信息来提高代码的可读性和可维护性。 首先,我们需要在引入koa-parameter时进行初始化,并指定我们想要使用的错误信息配置文件。可以通过传入一个包含自定义错误信息的对象来实现。例如: ``` const parameter = require('koa-parameter'); const errorMessages = require('./errorMessages'); // 自定义错误信息文件 app.use(parameter(app, { errorMessages })); ``` 接下来,在errorMessages.js文件,我们可以定义我们所需要使用的错误信息。其自定义错误信息需要按照koa-parameter的规定使用特定的错误码以及相应的错误信息。例如: ``` module.exports = { // 自定义错误码:错误信息 10001: '用户名已存在', 10002: '密码不能为空', // ... } ``` 然后,在我们的接口验证,如果出现参数验证失败的情况,我们可以通过throw抛出相关的错误。例如: ``` ctx.verifyParams({ name: { type: 'string', required: true, message: '请输入用户名', }, password: { type: 'string', required: true, message: '请输入密码', }, }); ``` 在上述示例,如果name或password参数验证失败,则会抛出一个错误。这个错误可以被koa-parameter捕获到,并根据我们之前定义的错误码对应的错误信息进行返回。 最后,在间件,我们可以通过try-catch语句块来捕获错误,并处理返回。例如: ``` app.use(async (ctx, next) => { try { await next(); } catch (err) { ctx.status = err.status || 400; ctx.body = { message: errorMessages[err.message] || err.message, }; } }); ``` 在上述代码,我们首先通过try-catch语句块来捕获可能出现的错误。然后,我们根据错误的状态码设置响应的状态码,并根据错误码对应的错误信息进行返回。 通过以上的步骤,我们就可以实现自定义错误信息的功能,并提高代码的可读性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端江湖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值