js 运行时产生错误,会抛出 Error
对象。也可以自行创建一个 Error
对象,比如
const err = new Error("出错了")
Error 属性
Error.prototype.message
,错误消息。对于用户创建的 Error 对象,这是构造函数的第一个参数提供的字符串。Error.prototype.name
,错误名称。这是由构造函数决定的。Error.prototype.cause
,表示导致当前错误被抛出的原因——通常是另一个错误。对于用户创建的 Error 对象,这是构造函数的第二个参数提供的值。Error.prototype.stack
,一个非标准的属性,用于堆栈跟踪。Error.prototype.fileName
,一个非标准的 Mozilla 属性,用于表示引发此错误的文件的路径。Error.prototype.lineNumber
,一个非标准的 Mozilla 属性,用于表示引发此错误的代码所在的文件的行号。Error.prototype.columnNumber
,一个非标准的 Mozilla 属性,用于表示引发此错误的代码在文件中所在行的列号。
Error 实例方法
Error.prototype.toString()
,返回表示该对象的字符串
err.toString()
// Error: 出错了
内置的错误类型
除了通用 Error
对象,JavaScript 还有其他类型的错误构造函数。
SyntaxError
,语法错误TypeError
,变量或参数不属于有效类型ReferenceError
,无效引用RangeError
,数值变量或参数超出其有效范围URIError
,给 encodeURI() 或 decodeURI() 传递的参数无效AggregateError
,其中包裹了由一个操作产生且需要报告的多个错误。如:Promise.any() 产生的错误。InternalError
,创建一个代表 Javascript 引擎内部错误的异常抛出的实例。如:递归太多。EvalError
,与 eval() 有关。
自定义错误类型
class CustomError extends Error {
constructor(...params) {
super(...params);
this.name = "CustomError";
}
}
通过以下方法使用
throw new CustomError("自定义错误")
错误处理
可以用 throw
抛出一个 Error
对象,可以用 try……catch
来处理异常
try {
throw new Error('出错了')
} catch (e) {
console.error(e.name + ': ' + e.message)
}
throw
可以抛出 Error
对象,也可以抛出其他类型。
throw Symbol();
throw 123;
throw "Error!";
throw null;
处理某一类型的错误
你可以通过判断异常的类型来特定处理某一类的异常,即判断 constructor
属性,当使用现代 JavaScript 引擎时,可使用 instanceof
关键字:
try {
foo.bar()
} catch (e) {
if (e instanceof EvalError) {
console.error(e.name + ': ' + e.message)
} else if (e instanceof RangeError) {
console.error(e.name + ': ' + e.message)
}
// ... etc
else {
// If none of our cases matched leave the Error unhandled
throw e;
}
}
区分相似的错误,通过 case 属性
有时,对于代码块的错误需要根据其原因进行不同的处理,但错误的原因又较为相似(例如:错误的类型和消息均相同)。
如果你无法控制原有错误的抛出,那么一种方法是捕获错误然后抛出一个新的错误,并在新的错误中给出更加具体的错误消息。原始错误应该被传递到新的 Error
的构造函数的 option
参数(cause
属性)中,这确保了原始的错误和堆栈追踪信息在上层的 try/catch 块中可用。
以下示例展示了两种方法会在失败时抛出相似的错误(doFailSomeWay()
和 doFailAnotherWay()
):
function doWork() {
try {
doFailSomeWay();
} catch (err) {
throw new Error('Failed in some way', { cause: err });
}
try {
doFailAnotherWay();
} catch (err) {
throw new Error('Failed in another way', { cause: err });
}
}
try {
doWork();
} catch (err) {
switch(err.message) {
case 'Failed in some way':
handleFailSomeWay(err.cause);
break;
case 'Failed in another way':
handleFailAnotherWay(err.cause);
break;
}
}
参考链接
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Error