Error 实例对象

JavaScript 解析或运行时,一旦发生错误,引擎就会抛出一个错误对象。JavaScript 原生提供Error构造函数,所有抛出的错误都是这个构造函数的实例。

 

var err = new Error('出错了');

err.message // "出错了"

上面代码中,我们调用Error构造函数,生成一个实例对象err。Error构造函数接受一个参数,表示错误提示,可以从实例的message属性读到这个参数。抛出Error实例对象以后,整个程序就中断在发生错误的地方,不再往下执行。

 

 

 

message:错误提示信息

name:错误名称(非标准属性)

stack:错误的堆栈(非标准属性)

使用name和message这两个属性,可以对发生什么错误有一个大概的了解。

 

if (error.name) {

  console.log(error.name + ': ' + error.message);

}

stack属性用来查看错误发生时的堆栈。

 

function throwit() {

  throw new Error('');

}

 

function catchit() {

  try {

    throwit();

  } catch(e) {

    console.log(e.stack); // print stack trace

  }

}

 

catchit()

// Error

//    at throwit (~/examples/throwcatch.js:9:11)

//    at catchit (~/examples/throwcatch.js:3:9)

//    at repl:1:5

 

 

原生错误类型

SyntaxError 对象

SyntaxError对象是解析代码时发生的语法错误。

 

// 变量名错误

var 1a;

// Uncaught SyntaxError: Invalid or unexpected token

 

// 缺少括号

console.log 'hello');

// Uncaught SyntaxError: Unexpected string

上面代码的错误,都是在语法解析阶段就可以发现,所以会抛出SyntaxError。第一个错误提示是“token 非法”,第二个错误提示是“字符串不符合要求”。

 

ReferenceError 对象

ReferenceError对象是引用一个不存在的变量时发生的错误。

 

// 使用一个不存在的变量

unknownVariable

// Uncaught ReferenceError: unknownVariable is not defined

另一种触发场景是,将一个值分配给无法分配的对象,比如对函数的运行结果或者this赋值。

 

// 等号左侧不是变量

console.log() = 1

// Uncaught ReferenceError: Invalid left-hand side in assignment

 

// this 对象不能手动赋值

this = 1

// ReferenceError: Invalid left-hand side in assignment

上面代码对函数console.log的运行结果和this赋值,结果都引发了ReferenceError错误。

 

RangeError 对象

RangeError对象是一个值超出有效范围时发生的错误。主要有几种情况,一是数组长度为负数,二是Number对象的方法参数超出范围,以及函数堆栈超过最大值。

 

// 数组长度不得为负数

new Array(-1)

// Uncaught RangeError: Invalid array length

TypeError 对象

TypeError对象是变量或参数不是预期类型时发生的错误。比如,对字符串、布尔值、数值等原始类型的值使用new命令,就会抛出这种错误,因为new命令的参数应该是一个构造函数。

 

new 123

// Uncaught TypeError: number is not a func

 

var obj = {};

obj.unknownMethod()

// Uncaught TypeError: obj.unknownMethod is not a function

上面代码的第二种情况,调用对象不存在的方法,也会抛出TypeError错误,因为obj.unknownMethod的值是undefined,而不是一个函数。

 

URIError 对象

URIError对象是 URI 相关函数的参数不正确时抛出的错误,主要涉及encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()和unescape()这六个函数。

 

decodeURI('%2')

// URIError: URI malformed

EvalError 对象

eval函数没有被正确执行时,会抛出EvalError错误。该错误类型已经不再使用了,只是为了保证与以前代码兼容,才继续保留。

 

 

自定义错误

除了 JavaScript 原生提供的七种错误对象,还可以定义自己的错误对象。

 

function UserError(message) {

  this.message = message || '默认信息';

  this.name = 'UserError';

}

 

UserError.prototype = new Error();

UserError.prototype.constructor = UserError;

上面代码自定义一个错误对象UserError,让它继承Error对象。然后,就可以生成这种自定义类型的错误了。

 

new UserError('这是自定义的错误!');

 

throw 语句

 

throw语句的作用是手动中断程序执行,抛出一个错误。

 

if (x < 0) {

  throw new Error('x 必须为正数');

}

// Uncaught ReferenceError: x is not defined

上面代码中,如果变量x小于0,就手动抛出一个错误,告诉用户x的值不正确,整个程序就会在这里中断执行。可以看到,throw抛出的错误就是它的参数,这里是一个Error实例。

 

throw也可以抛出自定义错误。

 

function UserError(message) {

  this.message = message || '默认信息';

  this.name = 'UserError';

}

 

throw new UserError('出错了!');

// Uncaught UserError {message: "出错了!", name: "UserError"}

上面代码中,throw抛出的是一个UserError实例。

 

实际上,throw可以抛出任何类型的值。也就是说,它的参数可以是任何值。

 

// 抛出一个字符串

throw 'Error!';

// Uncaught Error!

 

// 抛出一个数值

throw 42;

// Uncaught 42

 

// 抛出一个布尔值

throw true;

// Uncaught true

 

// 抛出一个对象

throw {

  toString: function () {

    return 'Error!';

  }

};

// Uncaught {toString: ƒ}

对于 JavaScript 引擎来说,遇到throw语句,程序就中止了。引擎会接收到throw抛出的信息,可能是一个错误实例,也可能是其他类型的值。

 

try…catch 结构

一旦发生错误,程序就中止执行了。JavaScript 提供了try...catch结构,允许对错误进行处理,选择是否往下执行。

 

try {

  throw new Error('出错了!');

} catch (e) {

  console.log(e.name + ": " + e.message);

  console.log(e.stack);

}

// Error: 出错了!

//   at <anonymous>:3:9

//   ...

 

 

 

Finally代码块

try...catch结构允许在最后添加一个finally代码块,表示不管是否出现错误,都必需在最后运行的语句。

 

function cleansUp() {

  try {

    throw new Error('出错了……');

    console.log('此行不会执行');

  } finally {

    console.log('完成清理工作');

  }

}

 

cleansUp()

// 完成清理工作

// Error: 出错了……

 

posted on 2018-02-24 10:51  Sharpest  阅读(229)  评论(0编辑  收藏  举报