--- title: Error slug: Web/JavaScript/Reference/Global_Objects/Error tags: - Error - Whoops! - 参考 translation_of: Web/JavaScript/Reference/Global_Objects/Error ---

{{JSRef}}

通过Error的构造器可以创建一个错误对象。当运行时错误产生时,Error的实例对象会被抛出。Error对象可用于用户自定义的异常的基础对象。下面列出了各种内建的标准错误类型。

语法

new Error([message[, fileName[,lineNumber]]])

参数

message
可选。人类可阅读的错误描述信息。
fileName {{non-standard_inline}}
可选。被创建的Error对象的fileName属性值。默认是调用Error构造器代码所在的文件 的名字。
lineNumber {{non-standard_inline}}
可选。被创建的Error对象的lineNumber属性值。默认是调用Error构造器代码所在的文件的行号

描述

当代码运行时的发生错误,会创建新的Error 对象,并将其抛出。

该页面描述了Error对象自身的使用,以及其构造函数的使用. 关于Error实例的内部属性和方法,请看 {{jsxref("Error.prototype")}}。

作为函数使用

当像函数一样使用 Error 时 -- 如果没有 {{jsxref("Operators/new", "new")}},它将返回一个 Error 对象。所以, 仅仅调用 Error 产生的结果与通过new 关键字构造 Error 对象生成的结果相同。 

// this:
const x = Error('I was created using a function call!');
​​​​// has the same functionality as this:
const y = new Error('I was constructed via the "new" keyword!');

Error 类型

除了通用的Error构造函数外,JavaScript还有6个其他类型的错误构造函数。更多客户端异常,详见 Exception Handling Statements

{{jsxref("EvalError")}}
创建一个error实例,表示错误的原因:与 {{jsxref("Global_Objects/eval", "eval()")}} 有关。
{{jsxref("InternalError")}} {{non-standard_inline}}
创建一个代表Javascript引擎内部错误的异常抛出的实例。 如: "递归太多".
{{jsxref("RangeError", "RangeError")}}
创建一个error实例,表示错误的原因:数值变量或参数超出其有效范围
{{jsxref("ReferenceError")}}
创建一个error实例,表示错误的原因:无效引用。
{{jsxref("SyntaxError")}}
创建一个error实例,表示错误的原因:{{jsxref("Global_Objects/eval", "eval()")}}在解析代码的过程中发生的语法错误
{{jsxref("TypeError")}}
创建一个error实例,表示错误的原因:变量或参数不属于有效类型。
{{jsxref("URIError")}}
创建一个error实例,表示错误的原因:给 {{jsxref("Global_Objects/encodeURI", "encodeURI()")}}或  {{jsxref("Global_Objects/decodeURI", "decodeURI()")}}传递的参数无效。

属性

{{jsxref("Error.prototype")}}
允许添加属性到Error实例。

方法

全局Error对象自身不包含任何方法,但从原型链中继承了一些方法.

Error 实例

{{page('en-US/docs/JavaScript/Reference/Global_Objects/Error/prototype', 'Description')}}

属性

{{page('en-US/docs/JavaScript/Reference/Global_Objects/Error/prototype', 'Properties')}}

方法

{{page('en-US/docs/JavaScript/Reference/Global_Objects/Error/prototype', 'Methods')}}

例子

抛出一个基本错误

通常你会使用{{jsxref("Statements/throw", "throw")}}关键字来抛出你创建的Error对象。可以使用 {{jsxref("Statements/try...catch", "try...catch")}} 结构来处理异常:

try {
    throw new Error("Whoops!");
} catch (e) {
    alert(e.name + ": " + e.message);
}

处理一个特定错误

你可以通过判断异常的类型来特定处理某一类的异常,即判断 {{jsxref("Object.prototype.constructor", "constructor")}} 属性,当使用现代Javascript引擎时,可使用{{jsxref("Operators/instanceof", "instanceof")}} 关键字:

try {
    foo.bar();
} catch (e) {
    if (e instanceof EvalError) {
        alert(e.name + ": " + e.message);
    } else if (e instanceof RangeError) {
        alert(e.name + ": " + e.message);
    }
    // ... etc
}

自定义异常类型

你可能希望自定义基于Error的异常类型,使得你能够 throw new MyError() 并可以使用 instanceof MyError 来检查某个异常的类型. 这种需求的通用解决方法如下.

注意,在FireFox中抛出自定义类型的异常会显示不正确的行号和文件名。

参考 "What's a good way to extend Error in JavaScript?" discussion on Stackoverflow.

// Create a new object, that prototypally inherits from the Error constructor.
function MyError(message) {
  this.name = 'MyError';
  this.message = message || 'Default Message';
  this.stack = (new Error()).stack;
}
MyError.prototype = Object.create(Error.prototype);
MyError.prototype.constructor = MyError;

try {
  throw new MyError();
} catch (e) {
  console.log(e.name);     // 'MyError'
  console.log(e.message);  // 'Default Message'
}

try {
  throw new MyError('custom message');
} catch (e) {
  console.log(e.name);     // 'MyError'
  console.log(e.message);  // 'custom message'
}

规范

Specification Status Comment
ECMAScript 1st Edition. Standard Initial definition. Implemented in JavaScript 1.1.
{{SpecName('ES5.1', '#sec-15.11', 'Error')}} {{Spec2('ES5.1')}}
{{SpecName('ES6', '#sec-error-objects', 'Error')}} {{Spec2('ES6')}}
{{SpecName('ESDraft', '#sec-error-objects', 'Error')}} {{Spec2('ESDraft')}}

浏览器兼容性

{{Compat("javascript.builtins.Error")}}

相关链接