js 解析或执行时,一旦发生错误,引擎就会抛出一个错误对象。js 原生提供一个 Error 构造函数,所有抛出的错误都是这个构造函数的实例。Error 构造函数接受一个参数,表示错误提示,可以从实例的 message
属性读到这个参数。
const err = new Error("Validation fail!");
err.message
// → "Validation fail!"
Error 对象是最一般的错误类型,在它的基础上,JavaScript 还定义了其他6种错误,也就是说,存在 Error 的6个派生对象。
-
SyntaxError:语法错误
const 1a = 10; // ❌ Uncaught SyntaxError: Invalid or unexpected token if(true) { console.log('Hi); } // ❌ Uncaught SyntaxError: Invalid or unexpected token
-
ReferenceError:引用错误
const b = a; // ❌ Uncaught ReferenceError: a is not defined
-
TypeError:类型错误
const bar = new 'Hi'; // ❌ Uncaught TypeError: "Hi" is not a constructor const foo = {}; foo.test(); // ❌ Uncaught TypeError: foo.test is not a function
-
RangeError:范围错误
-
URIError:URI 错误
-
EvalError:eval() 函数中的错误
用于手动抛出一个异常,当程序运行过程中遇到无法继续执行的错误时,可以通过 throw 抛出一个异常来中断程序的执行并且提示错误信息。
throw Error('异常提示信息');
throw "异常提示信息";
通过 console.assert(condition, tips);
可以根据条件是否满足输出异常信息:
var age = 12;
console.assert(age > 18, "未满18岁!");
用于捕获和处理可能抛出异常的代码块,如果 try 块中的代码抛出了异常,则会跳转到 catch 块中执行对应的异常处理逻辑。
try {
alertt("Hello, World!");
}catch(err) {
// 捕捉异常
let des = "错误警告:" + err.message;
alert(des);
}
Tips:
try…catch
结构是 js 语言受到 Java 语言影响的一个明显的例子。这种结构多多少少是对结构化编程原则一种破坏,处理不当就会变成类似goto语句的效果,应该谨慎使用。
try…catch 结构允许在最后添加一个 finally 代码块,无论是否发生异常,finally 块中的代码都会被执行。通常用于释放资源或者清理操作。
try {
} catch(err) {
} finally {
}
用于捕获 Promise 中 reject 状态的异常。
可以在全局范围内捕获未被捕获的异常,但是需要注意该事件只能捕获同步代码执行过程中的异常,并且某些浏览器不支持该事件。