JavaScript 解析或运行时,一旦发生错误,引擎就会抛出一个错误对象。 JavaScript原生提供 · 构造函数,所有抛出的错误都是这个构造函数的实例。
let err = new Error('出错了');
console.log(err.message); // "出错了"
上面代码中,我们调用 Error
构造函数,生成一个实例对象 err
。 Error
构造函数接受一个参数,表示错误提示,可以从实例的 message
属性读到这个参数。 抛出 Error
实例对象以后,
整个程序就中断在发生错误的地方,不再往下执行 Error
实例还提供 name
和 stack
属性,分别表示错误的名称和错误的堆栈,但它们是非标准的,不是每种实现都有。
function throwit(){
throw new Error('报错了');//抛出一个错误
}
2.原生错误类型
实例对象是最一般的错误类型, 在它的基础上,JavaScript
还定义了其他6种错误对象。
SyntaxError
对象是解析代码时发生的语法错误ReferenceError
对象是引用一个不存在的变量时发生的错误。RangeError
对象是一个值超出有效范围时发生的错误。主要有几种情况, 一是数组长度为负数,二是Number对象的方法参数超出范围,以及函数堆栈超过最大值。TypeError
对象是变量或参数不是预期类型时发生的错误。比如,对字符串、布尔值、 数值等原始类型的值使用new命令,就会抛出这种错误,因为new命令的参数应该是一个构造函数。URIError
对象是 URI
相关函数的参数不正确时抛出的错误,主要涉及 encodeURI()
、decodeURI()
、 encodeURIComponent()
、decodeURIComponent()
、escape()
和unescape()
这六个函数。eval
函数没有被正确执行时,会抛出 EvalError
错误。该错误类型已经不再使用了, 只是为了保证与以前代码兼容,才继续保留。
以上这6种派生错误,连同原始的 Error
对象,都是构造函数。可以使用它们,手动生成错误对象的实例。
这些构造函数都接受一个参数,代表错误提示信息message
。
除了JS 原生提供的七种错误对象(Error
TypeError
ReferenceError
EvalError
SyntaxError
RangeError
URIError
) 还可以定义自己的错误对象
class UserError extends Error {
constructor(message) {
super(message);
this.message = message || '这是开发者自定义的错误';
this.name = 'UserError';
}
}
function test() {
try{
throw new UserError('测试')
}catch (e){
console.log(e.name);
console.log(e.message);
// UserError
// 测试
}
}
test();
4.throw 语句
throw
语句的作用时手动终端程序的执行 抛出一个错误
let x = -1;
if(x<=0){
throw new Error('x必须为正数');
}
实际上 thorw
可以抛出任何类型的值 也就是说 他的参数可以是任何值
// 抛出一个字符串
throw 'Error!';
// Uncaught Error!
// 抛出一个数值
throw 42;
// Uncaught 42
// 抛出一个布尔值
throw true;
// Uncaught true
// 抛出一个对象
throw {
toString: function () {
return 'Error!';
}
};
// Uncaught {toString: ƒ}
对于 JavaScript 引擎来说,遇到 throw
语句,程序就中止了。 引擎会接收到 throw
抛出的信息,可能是一个错误实例,也可能是其他类型的值
一旦发生错误,程序就中止执行了。 JavaScript 提供了try...catch
结构,允许对错误进行处理,选择是否往下执行。
try{
throw new Error('出错了');
}catch(e){
console.log(`${e.name}:${e.message}`)
console.log(e.stack);
}
//Error:出错了
//Error: 出错了
//at Object.
console.log(111);
可以看到此处的 111 仍然执行了程序报错后 try...catch
可以捕获错误 并可以让程序继续执行 如果你不确定某些代码是否会报错, 就可以把它们放在try...catch
代码块之中,便于进一步对错误进行处理。
try{
fu()
}catch(e){
//错误处理
}
6.finally 代码块
try...catch
结构允许在最后添加一个 finally
代码块,表示不管是否出现错误,都必需在最后运行的语句。
function cleansUp() {
try {
throw new Error('出错了……');
console.log('此行不会执行');
} finally {
console.log('完成清理工作');
}
}
cleansUp()
// 完成清理工作
// Uncaught Error: 出错了……
// at cleansUp (:3:11)
// at :10:1
由于没有 catch
语句块,一旦发生错误,代码就会中断执行。 中断执行之前,会先执行 finally
代码块,然后再向用户提示报错信息。
function idle(x) {
try {
console.log(x);
return 'result';
} finally {
console.log('FINALLY');
}
}
idle('hello')
// hello
// FINALLY
try
代码块没有发生错误,而且里面还包括 return
语句, 但是 finally
代码块依然会执行。而且,这个函数的返回值还是 result
。
return
是排在 finally
之前执行的 只是等 finally
代码执行完毕之后才会返回 try...catch...finally
这三者之间的执行顺序
function f() {
try {
console.log(0);
throw 'bug';
} catch(e) {
console.log(1);
return true;
console.log(2); // 不会运行
} finally {
console.log(3);
return false; // 这句会覆盖掉前面那句 return
console.log(4); // 不会运行
}
console.log(5); // 不会运行
}
var result = f();
// 0
// 1
// 3
result
// false
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)